web-dev-qa-db-ja.com

ヘルパーのcontent_tag内でcontent_tagsをループして出力します

アイテムのリストを出力するヘルパーメソッドを試しています。次のように呼び出されます。

_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_はコレクションを使用したブロックモードで機能するはずです。

29
DEfusion

これを試して:

def foo_list items
  content_tag :ul do
      items.collect {|item| concat(content_tag(:li, item))}
  end
end
50
zetetic

私はその仕事をこれ以上良くすることができませんでした。

[〜#〜] 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", "#"), ... ])

出力は正しく意図されています。

8
Heikki

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をインストールする必要があります。

5
Daniel Rikowski

上記の答えに加えて、これは私にとってうまくいきました:

(1..14).to_a.each do |age|
  concat content_tag :li, "#{link_to age, '#'}".html_safe
end
3
The Whiz of Oz

大きな問題は、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
2
billmag