使用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为空。我怎样才能使它工作?
这不起作用的原因是…我不太确定。在concat
和tag
之间肯定发生了一些奇怪的事情:
: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 %>