【问题标题】:Sinatra tries to load haml engine when I use RespondWith当我使用 RespondWith 时,Sinatra 尝试加载 haml 引擎
【发布时间】:2015-12-19 00:21:15
【问题描述】:

我想让相同的 URL 响应 HTML 或 JSON,具体取决于请求的 Accept 标头,因此我尝试使用来自 Sinatra::Contrib 的 RespondWith extension

每当我向respond_with() 提供模板名称时,我都会收到错误消息。该错误似乎是在尝试加载 Haml 模板引擎时发生的。

我只想使用 Erb 模板引擎,如何禁用 Haml 模板引擎?

我看到的错误是,“LoadError - cannot load such file -- haml”。

这是运行 Web 服务器的 app.rb 文件:

require 'rubygems'
require 'sinatra'
require 'sinatra/respond_with'
require 'tilt/erubis'

get '/' do
  @name = 'Bob'
  json_data = { :name => @name }
  respond_with :'index.html', json_data
end

这是模板文件views/index.html.erb

<html>
<body>
<h1>Index Page</h1>
<h2><%= @name %></h2>
</body>
</html>

这是我在请求 HTML 或 JSON 时收到的错误的完整堆栈跟踪:

2015-12-18 15:57:28 - LoadError - cannot load such file -- haml:
  /home/don/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  /home/don/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/haml.rb:2:in `<top (required)>'
  /home/don/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  /home/don/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/mapping.rb:236:in `block in lazy_load'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/mapping.rb:234:in `each'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/mapping.rb:234:in `lazy_load'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/mapping.rb:214:in `lookup'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt/mapping.rb:152:in `[]'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt.rb:48:in `[]'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:182:in `block in template_for'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:177:in `each'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:177:in `template_for'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:139:in `block (2 levels) in respond_with'
  /home/don/.rvm/gems/ruby-2.2.2/gems/tilt-2.0.1/lib/tilt.rb:88:in `fetch'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:139:in `block in respond_with'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:115:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:115:in `block in finish'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:114:in `each'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:114:in `finish'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-contrib-1.4.6/lib/sinatra/respond_with.rb:159:in `respond_with'
  app.rb:18:in `block in <main>'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1610:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1610:in `block in compile!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in `[]'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in `block (3 levels) in route!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:993:in `route_eval'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:974:in `block (2 levels) in route!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1014:in `block in process_route'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1012:in `catch'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1012:in `process_route'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:972:in `block in route!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:971:in `each'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:971:in `route!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1084:in `block in dispatch!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `block in invoke'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `catch'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `invoke'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1081:in `dispatch!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:906:in `block in call!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `block in invoke'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `catch'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1066:in `invoke'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:906:in `call!'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:894:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:218:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:211:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/show_exceptions.rb:21:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:181:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:2021:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1486:in `block in call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1795:in `synchronize'
  /home/don/.rvm/gems/ruby-2.2.2/gems/sinatra-1.4.6/lib/sinatra/base.rb:1486:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/thin-1.6.3/lib/thin/connection.rb:86:in `block in pre_process'
  /home/don/.rvm/gems/ruby-2.2.2/gems/thin-1.6.3/lib/thin/connection.rb:84:in `catch'
  /home/don/.rvm/gems/ruby-2.2.2/gems/thin-1.6.3/lib/thin/connection.rb:84:in `pre_process'
  /home/don/.rvm/gems/ruby-2.2.2/gems/eventmachine-1.0.8/lib/eventmachine.rb:1062:in `call'
  /home/don/.rvm/gems/ruby-2.2.2/gems/eventmachine-1.0.8/lib/eventmachine.rb:1062:in `block in spawn_threadpool'

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    Tilt 模板引擎注册表似乎默认注册了一大堆引擎。如果我只是显式注册我想要的模板引擎,那么它会停止尝试加载其他所有内容。

    require 'rubygems'
    require 'sinatra'
    require 'sinatra/respond_with'
    require 'tilt/erubis'
    
    set :template_engines, {
      :css=>[],
      :xml=>[],
      :js=>[],
      :html=>[:erb],
      :all=>[:erb],
      :json=>[]
    }
    
    get '/' do
      @name = 'Bob'
      json_data = { :name => @name }
      respond_with :'index.html', json_data
    end
    

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2018-12-05
      相关资源
      最近更新 更多