アイテムのリストを出力するヘルパーメソッドを試しています。次のように呼び出されます。
_foo_list( ['item_one', link_to( 'item_two', '#' ) ... ] )
_
読んだ後、私はそのようにヘルパーを書きました Rails 3でヘルパーを使用してhtmlを出力する :
_def foo_list items
content_tag :ul do
items.collect {|item| content_tag(:li, item)}
end
end
_
ただし、これをテストとして実行すると、その場合は空のULが取得されます。
_def foo_list items
content_tag :ul do
content_tag(:li, 'foo')
end
end
_
期待通りUL&LIがもらえます。
私はそれを少し交換してみました:
_def foo_list items
contents = items.map {|item| content_tag(:li, item)}
content_tag( :ul, contents )
end
_
その場合、リスト全体を取得しますが、LIタグはhtmlエスケープされます(文字列はHTMLセーフですが)。 content_tag(:ul, contents.join("\n").html_safe )
を実行しても機能しますが、私には違和感があり、_content_tag
_はコレクションを使用したブロックモードで機能するはずです。
これを試して:
def foo_list items
content_tag :ul do
items.collect {|item| concat(content_tag(:li, item))}
end
end
私はその仕事をこれ以上良くすることができませんでした。
[〜#〜] haml [〜#〜] をすでに使用している場合は、次のようにヘルパーを作成できます。
def foo_list(items)
haml_tag :ul do
items.each do |item|
haml_tag :li, item
end
end
end
ビューからの使用法:
- foo_list(["item_one", link_to("item_two", "#"), ... ])
出力は正しく意図されています。
content_tag_for
を使用できます。これは、コレクションで機能します。
def foo_list(items)
content_tag(:ul) { content_tag_for :li, items }
end
更新:In Rails 5 content_tag_for
(およびdiv_for
)は別の場所に移動されましたgem。使用するには、 record_tag_helper
gemをインストールする必要があります。
上記の答えに加えて、これは私にとってうまくいきました:
(1..14).to_a.each do |age|
concat content_tag :li, "#{link_to age, '#'}".html_safe
end
大きな問題は、content_tagが配列を受信したときにスマートなことを何もしていないことです。処理済みのコンテンツを送信する必要があります。これを行う良い方法は、配列を折りたたむ/縮小して、すべてを連結することです。
たとえば、最初と3番目の例では、items.map/collect行の代わりに次を使用できます。
items.reduce(''.html_safe) { |x, item| x << content_tag(:li, item) }
参考までに、このコードを実行するときに遭遇するconcatの定義を次に示します(actionpack/lib/action_view/helpers/tag_helper.rbから)。
def concat(value)
if dirty? || value.html_safe?
super(value)
else
super(ERB::Util.h(value))
end
end
alias << concat