我想在 Rails 中创建一个视图助手,它允许如下语法:
<%= some_fancy_list @items do |h| %>
<%= h.rows :class => "whatever" |item| %>
<td><= item.id %>
<% end %>
<% end %>
我已经建立了这个效果(这是一个简化的版本)
def some_fancy_list(items, &block)
h = InternalHelper.new(:items => items)
content_tag(:table) { block.call(h) }
end
class InternalHelper
include ActionView::Helpers::TagHelper
include ActionView::Context
def initialize
...
end
def rows(options = {}, &block)
content_tag(:tbody) do
@items.each do |item|
content_tag(:tr, options) do
block.call(item) if block_given?
end
end
end
end
end
问题是它输出的 HTML 不是我所期望的。
<table>
<td>1</td>
<td>2</td>
<td>3</td>
<tbody></tbody>
</table>
<tr>
's 完全丢失,'s 的块内容甚至<td>
不在<tbody>
标签内。
我在 StackOverflow 上发现了这个问题:Loop & output content_tags within content_tag in helper并尝试使用,concat
但是我收到以下错误:
undefined method `concat'
我猜这与丢失的上下文有关,.each
但我不知道如何解决它。