如何在帮助器中嵌套Rails标签?



使用Rails 6.1,尝试在helper方法中嵌套内容:

tag.div do
  concat tag.span 'Options: ', class: 'small'
  concat tag.span do
    doc.options.each do
      concat option.title
    end
  end
end

我希望它返回一个div,里面有两个span,其中第一个有"Options"字符串,第二个字符串包含所有选项的标题。但这行不通。最后是:

<div>
  <span class="small">Options: </span>
  <span></span>
</div>

最后一个span为空。我怎样才能使它工作?

这不起作用的原因是…我不太确定。在concattag之间肯定发生了一些奇怪的事情:

:0> tag.div do
:1*   tag.span { "A" }
:1> end
=> "<div><span>A</span></div>"
# But:
:0>tag.div do
:1*   tag.span { "A" }
:1>   tag.span { "B" }
:1> end
=> "<div><span>B</span></div>"
# But also:
:0> tag.div do
:1*   concat tag.span { "A" }
:1>   concat tag.span { "B" }
:1> end
=> "<div><span></span><span></span></div>"
:0> helper.tag.div do
:1*   concat tag.span { concat "A" }
:1>   concat tag.span { concat "B" }
:1> end
=> "<div><span>A</span><span>B</span></div>"
# For completeness:
:0> tag.div do
:1*   concat tag.span "A"
:1>   concat tag.span "B"
:1> end
=> "<div><span>A</span><span>B</span></div>"

也许更精通Rails的人可以更好地解释它。但是我可以给你一个解决办法。


或者更确切地说,我不知道你想要实现什么,但你可以这样做:

tag.div do
  concat tag.span "A"
  concat tag.span([1, 2, 3].join(" "))
end

会得到<div><span>1 2 3</span></div>。您还可以完全取消concat:

tag.div do
  tag.span "A"
  tag.span([1, 2, 3].join(" "))
end

但是如果你想让每个title作为自己的span,你做错了:

:0> tag.div do
:1*   concat tag.span "A"
:1>   ["B", "C"].each { |c| concat tag.span c }
:1> end
=> "<div><span>A</span><span>B</span><span>C</span></div>"

最后;对于这种静态html,没有理由使用helper;最好是在erb或haml文件中提供:

<span class="small">Options</span>
<% doc.options.each do |option| %>
  <span><%= option.title %></span>
<% end %>

最新更新