为什么这个嵌套的 content_tag 无法正确呈现?

Why does this nested content_tag not render properly?

我的助手中有这个:

  def favorites_count(node)
    content_tag :span, class: "card-favorite-count" do
      content_tag :i, class: "icon-heart"
      node.cached_votes_total
    end
  end

在视图中这样调用:

<%= favorites_count(node) %>

这呈现了这个:

<span class="card-favorite-count"></span>

如何让它渲染整个东西?

编辑 1

根据下面@tolgap 的建议,我尝试了这个:

  def favorites_count(node)
    content_tag :span, class: "card-favorite-count" do
      content_tag(:i, "" ,class: "icon-heart") + node.cached_votes_total
    end
  end

但是这并没有输出node.cached_votes_total中的数字值。但它会以正确的语义顺序输出其他所有内容。这只是最后一部分还不能正常工作。

do 块中的最后一个表达式是 content_tag 的内容。所以将其更改为:

def favorites_count(node)
  content_tag :span, class: "card-favorite-count" do
    node.cached_votes_total + content_tag(:i, class: "icon-heart")
  end
end

所以你将这两个连接在一起。当然,您现在需要对 node.cached_total_votes 进行 nil 检查。

所以我找到了答案。正确的解决方案如下所示:

  def favorites_count(node)
    content_tag :span, class: "card-favorite-count" do
      concat(content_tag(:i, "" ,class: "icon-heart"))
      concat(node.cached_votes_total)
    end
  end

请注意,我必须使用两个 concat() 方法,因为 concat 基本上就像对视图的 puts。 content_tag 基本上只是 returns 视图方法中的最后一行,因此要覆盖它我必须这样做。

本文来自this article and this SO answer.