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

时间:2010-10-20 04:56:38

标签: ruby view sinatra haml

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

我正在尝试使用index.haml

中的以下行进行渲染
.navigation
  = render :partial => "nav"

4 个答案:

答案 0 :(得分:59)

你可以使用Sinatra的haml函数:

= haml :nav

答案 1 :(得分:13)

或者你可以这样做:

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

并将您的部分内容包括在内:

= partial( "something-rad" )

答案 2 :(得分:8)

以下是我的表现方式(比@ 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

答案 3 :(得分:7)

编辑:!!!已过时!!! 请阅读下面的Jason's回答!

你在rails尝试做什么工作! Sinatra没有partial方法。来自partial的{​​{1}}的实现看起来像来自github的 this (source gist)

Sinatra

包含此方法,您可以在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 文件中拨打partial,例如
.haml

如果您希望= partial("partial_name")其他视图中的视图语法为
render

请注意= render(:haml,:'rel_path_to_view',:locals => {:optional => option})rails方法之间关于sinatra方法的语法差异!