【问题标题】:How to render partial templates for an array of objects within a helper method?如何在辅助方法中为对象数组呈现部分模板?
【发布时间】:2013-09-20 15:35:45
【问题描述】:

我正在使用 Ruby on Rails 3.2.13,我想在辅助方法中为一组对象呈现部分模板。也就是说,在我的帮助文件中,我有:

def render_articles(articles)
  articles.each do |article|
    render :partial => ...
  end
end

然而,上述方法不返回部分模板,而是返回一个数组。我怎样才能正确渲染这些?

【问题讨论】:

  • 为什么不只是render :partial => '...', :collection => articles

标签: ruby-on-rails ruby arrays templates rendering


【解决方案1】:

您拥有的each 块不返回块的内容,而是返回数组本身。您需要一种机制来返回内容。

一种方法:

def render_articles(articles)
  html = ""
  articles.each do |article|
    html += render :partial => ...
  end
  html.html_safe
end

另一种方法:

def render_articles(articles)
  articles.inject("") { |html, article| html + render :partical =>... }.html_safe
end

【讨论】:

  • 通过使用您的代码,我得到部分模板的纯文本,并且该文本不会呈现为 HTML 代码,除非我使用 html_safe 方法。但是,一般来说,使用html_safe方法有危险吗?
  • @user502052 你必须使用html_safe。在这种情况下并不危险。
  • 你也可以,更短:articles.map { |article| render partial: ... }.join('').html_safe
  • @Olivier El Mekki - 出于好奇,两种提议的解决方案(injectmap)之间性能最高的方法是什么?
  • #map 的效率稍高,但仅限于高计算量:gist.github.com/oelmekki/6f5fcc120e052a84ffdd。这对您的情况没有任何影响(除非您生成 10 000 个部分,否则这不会是您更糟糕的问题:))
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2023-03-10
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多