我的部分不起作用

时间:2012-04-09 06:18:30

标签: ruby windows sinatra haml

我正在尝试将我的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

这是什么原因?

2 个答案:

答案 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>