2010-10-20 95 views
18

我有一个简单的sinatra应用程序,它使用haml和sass作为视图。其中一个视图(位于视图文件夹中)是我的导航菜单的一部分。我试图从index.haml使其但我得到以下错误:错误的参数数目(1 2)如何渲染sinatra视图中的部分(haml in haml)?

我想在index.haml以下行以使其

.navigation 
    = render :partial => "nav" 
+0

如果你想要更多的答案,我建议加上'ruby'到标签 – kfl62 2010-10-20 07:59:31

回答

7

编辑:!!! OUTDATED !!!阅读下面Jason's的答案!

你想在rails工作! Sinatra没有partial方法。的partialSinatra的实现看起来像 this (source gist)从GitHub:

module Haml 
    module Helpers 
    def partial(template, *args) 
     template_array = template.to_s.split('/') 
     template = template_array[0..-2].join('/') + "/_#{template_array[-1]}" 
     options = args.last.is_a?(Hash) ? args.pop : {} 
     options.merge!(:layout => false) 
     if collection = options.delete(:collection) then 
     collection.inject([]) do |buffer, member| 
      buffer << haml(:"#{template}", options.merge(:layout => 
      false, :locals => {template_array[-1].to_sym => member})) 
     end.join("\n") 
     else 
     haml(:"#{template}", options) 
     end 
    end 
    end 
end 

包括这种方法,你可以调用你的.haml文件partial,像
= partial("partial_name")

如果你想render视图中的其他查看语法是
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

注意语法差异和sinatra关于render方法!

+0

我真的不明白为什么有人会下降投一个明显过时的答案。当时这是正确的。 LoL无所谓:) – kfl62 2013-04-20 14:22:56

+1

由于我看到人们仍然链接到这个答案,我从主要代码中取得了代码,并将它编入了一个gem,其中[Lenary](https://github.com/lenary)(the原作的作者)也自此作出了贡献。它有后续的改进和规格等https://rubygems.org/gems/sinatra-partial。 – iain 2013-05-07 11:40:04

+0

我认为最好是被拒绝投票,以便在上面列出更好的答案。那么,我知道实际上不应该这样做,但相反,SO应该有一个功能来处理过时的答案。 – 2014-09-02 14:30:05

12

或者你可以这样做:

helpers do 
    def partial(page, options={}) 
    haml page.to_sym, options.merge!(:layout => false) 
    end 
end 

,包括你的局部有:

= partial("something-rad") 
7

这里是我如何做到这一点(更简单地比@ kfl62的回答,功能更丰富,比@ JM3的答案):

module Partials 
    def partial(page, variables={}) 
    haml page.to_sym, {layout:false}, variables 
    end 
end 
helpers Partials 

用它在你的Haml的文件里柯:

%ul#comments 
    - @comments.each do |comment| 
    %li= partial :comment, comment:comment 
+0

我知道这是*令人难以置信的*旧Phrogz,但我想指出......“haml page.to_sym,{layout:false},变量”应该可能是 “haml page.to_sym,{:layout = > false},变量“ – user766987 2011-07-13 02:24:02

+0

@ user766987你说什么适用于旧的1.8和1。9;我的答案是使用Ruby 1.9语法。 – Phrogz 2011-07-13 02:42:20

+0

永远向你学习Phrogz,谢谢! :) – user766987 2011-07-13 18:32:13

55

你可以使用Sinatra的HAML功能:

= haml :nav 
+1

在代码清洁方面,这胜过所有其他解决方案。 – Henson 2013-03-12 15:12:30

+1

这是迄今为止最好的答案。你不需要任何特殊的代码,它是内置的! – 2013-05-06 21:17:18

+0

如果您已将它设置为正确使用红地毯,您可以使用'= markdown:README' – 2014-08-06 21:34:36