我正在尝试将我的HAML视图拆分为单独的文件。我已阅读Sinatra Book并尝试实施基本版本。
所以我创建了 app_helpers.rb 文件:
# Usage: partial :foo
helpers do
def partial(page, options={})
haml page, options.merge!(:layout => false)
end
end
并在 application.rb :
中提出要求require 'sinatra'
require_relative './app_helpers.rb'
然后我创建了部分视图/ test.haml:
<h3> Test message </h3>
并在我的 index.haml :
中要求它= partial :test
但是当我刷新页面时,我收到错误消息:
NoMethodError - undefined method `partial' for #<Application:0x514dbe0>:
c:/Dropbox/development/myprojects/test/sinatra-bootstrap/views/index.haml:27:in `evaluate_source'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/template.rb:209:in `instance_eval'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/template.rb:209:in `evaluate_source'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/template.rb:144:in `cached_evaluate'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/template.rb:127:in `evaluate'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/haml.rb:24:in `evaluate'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/tilt-1.3.3/lib/tilt/template.rb:76:in `render'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/sinatra-1.3.1/lib/sinatra/base.rb:625:in `render'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/sinatra-1.3.1/lib/sinatra/base.rb:522:in `haml'
我该如何解决?
更新
如果我以这样的方式重写 app_helpers.rb ,一切正常:
def partial(page, options={})
haml page, options.merge!(:layout => false)
end
这是什么原因?
答案 0 :(得分:1)
Sinatra partials在FAQs中有一个很好的部分。使用gist包含您需要创建的文件。但是他们现在已经创建了一个gem Sinatra-Partial。
我的建议是将此gem用于partials(Sinatra-Partial)。
答案 1 :(得分:0)
无法重现:
C:\test>cat views\layout.haml
%body= yield
C:\test>cat views\index.haml
#main=partial :test
C:\test>cat views\test.haml
%h3 Hello World
C:\test>cat test_partial.rb
require 'sinatra'
require 'haml'
helpers do
def partial(page, options={})
haml page, options.merge!(:layout => false)
end
end
get '/' do
haml :index
end
c:\test>ruby -v
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]
C:\test>curl http://127.0.0.1:4567/
<body><div id='main'><h3>Hello World</h3></div></body>
但是,如@Konstantin所述,从Sinatra 1.1.0开始,不再需要使用自定义partials
方法。如果我将index.haml
更改为#main=haml :test
并删除partials
方法,则输出相同。
在早期版本的Sinatra中你会看到输出:
<body><div id='main'><body><h3>Hello World</h3></body></div></body>