Ruby 如何在sinatra视图中渲染局部(haml中的haml)?

Ruby 如何在sinatra视图中渲染局部(haml中的haml)?,ruby,view,sinatra,haml,Ruby,View,Sinatra,Haml,我有一个简单的sinatra应用程序,它使用haml和sass进行查看。其中一个视图(位于“视图”文件夹中)是“我的导航”菜单的一部分。我试图从index.haml呈现它,但我得到了以下错误:参数数量错误(1代表2) 我试图在index.haml中用以下几行来渲染它 .navigation = render :partial => "nav" 编辑:!!!过时阅读下面的答案 您正在尝试的是在rails中工作的内容Sinatra没有partial方法。Sinatra上的partial实

我有一个简单的sinatra应用程序,它使用haml和sass进行查看。其中一个视图(位于“视图”文件夹中)是“我的导航”菜单的一部分。我试图从index.haml呈现它,但我得到了以下错误:参数数量错误(1代表2)

我试图在index.haml中用以下几行来渲染它

.navigation
  = render :partial => "nav"

编辑:!!!过时阅读下面的答案

您正在尝试的是在
rails中工作的内容
Sinatra
没有
partial
方法。
Sinatra
上的
partial
实现类似于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
模块助手
def部分(模板,*args)
template_array=template.to_.s.split('/'))
template=template_数组[0..-2]。联接('/')+“/{template_数组[-1]}”
options=args.last.is_a?(散列)?args.pop:{}
选项。合并!(:布局=>false)
如果collection=options.delete(:collection),则
collection.injection([])do |缓冲区,成员|
缓冲器
false,:locals=>{template_array[-1]。to_sym=>member})
结束。加入(“\n”)
其他的
haml(:“#{template}”,选项)
结束
结束
结束
结束
包括此方法,您可以在
.haml
文件中调用
partial
,如
=部分(“部分名称”)

如果要
呈现
其他视图中的视图,语法为
=render(:haml,:'rel_path_to_view',:locals=>{:optional=>option})


注意
rails
sinatra
之间关于
render
方法的语法差异

或者您可以这样做:

helpers do
  def partial(page, options={})
    haml page.to_sym, options.merge!(:layout => false)
  end
end
并将您的部分内容包括在:

= partial( "something-rad" )
我是这样做的(比@kfl62的答案更简单,比@jm3的答案更丰富):

模块部分
def partial(第页,变量={})
haml page.to_sym,{layout:false},变量
结束
结束
助手部分
在Haml文件中使用它,如:

%ul#注释
-@comments.each do| comment|
%li=部分:注释,注释:注释

您只需使用Sinatra的haml功能即可:

= haml :nav

如果你想要更多的答案,我建议在tagsI中添加
ruby
,我知道这是非常古老的Phrogz,但我想指出的是。。。“haml page.to_sym,{layout:false},variables”可能应该是“haml page.to_sym,{:layout=>false},variables”@user766987您所说的适用于旧的1.8和1.9;我的答案是使用Ruby 1.9语法。就代码清洁度而言,这胜过所有其他解决方案。这是迄今为止最好的答案。你不需要任何特殊的代码,它是内置的!如果你有正确使用红地毯的设置,你可以用markdown:README来逃避。我真不明白为什么有人会否决一个明显过时的答案。当时这是对的。LoL不要紧:)因为我看到人们仍然在链接这个答案,所以我从gist中提取了代码,并将其制作成一个gem,它(原始gist的作者)也因此做出了贡献。它有后续的改进和规格等。我认为最好是被否决,以便更好的答案可以列在上面。嗯,我知道它实际上不应该这样做,但是它应该有一个功能来处理过时的答案。