【问题标题】:How to render a partial in sinatra view (haml in haml)?如何在 sinatra 视图中渲染部分内容(haml in haml)?
【发布时间】:2011-04-27 20:31:26
【问题描述】:

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

我正在尝试使用 index.haml 中的以下行来呈现它

.navigation
  = render :partial => "nav"

【问题讨论】:

  • 如果您想要更多答案,我建议将ruby 添加到标签

标签: ruby view sinatra haml


【解决方案1】:

编辑:!!!过时了!!!阅读下面的Jason's答案!

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

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 =&gt; {:optional =&gt; option})

注意railssinatra 之间关于render 方法的语法差异!

【讨论】:

  • 我真的不明白为什么有人会否决一个明显过时的答案。在当时,这是正确的。大声笑没关系:)
  • 因为我看到人们仍在链接到这个答案,所以我从 gist 中提取了代码并将其制作成一个 gem,Lenary(原始 gist 的作者)也为它做出了贡献.它有后续改进和规格等rubygems.org/gems/sinatra-partial.
  • 我认为最好被否决,以便可以在其上方列出更好的答案。好吧,我知道实际上不应该那样做,但是 SO 应该有一个功能来处理过时的答案。
【解决方案2】:

你可以只使用 Sinatra 的 haml 函数:

= haml :nav

【讨论】:

  • 在代码清洁度方面,这胜过所有其他解决方案。
  • 这是迄今为止最好的答案。您不需要任何特殊代码,它是内置的!
  • 如果您已将其设置为正确使用 redcarpet,则可以使用 = markdown :README 逃脱
【解决方案3】:

这是我的做法(比@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

【讨论】:

  • 我知道这是 难以置信 老 Phrogz,但我想指出的一点...“haml page.to_sym, {layout:false}, variables”应该是"haml page.to_sym, {:layout => false}, 变量"
  • @user766987 你说的适用于旧的 1.8 和 1.9;我的答案是使用 Ruby 1.9 语法。
【解决方案4】:

或者你可以这样做:

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

并包含您的部分内容:

= partial( "something-rad" )

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 2013-03-13
    • 2015-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多