Rails-ネストされたcontent_tag


84

次のようなものを作成するために、コンテンツタグをカスタムヘルパーにネストしようとしています。

<div class="field">
   <label>A Label</label>
   <input class="medium new_value" size="20" type="text" name="value_name" />
</div>

入力はフォームに関連付けられていないことに注意してください。JavaScriptを介して保存されます。

これがヘルパーです(HTMLを表示するだけでなく、さらに多くのことができます):

module InputHelper
    def editable_input(label,name)
         content_tag :div, :class => "field" do
          content_tag :label,label
          text_field_tag name,'', :class => 'medium new_value'
         end
    end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

ただし、ヘルパーを呼び出すとラベルが表示されず、入力のみが表示されます。text_field_tagをコメントアウトすると、ラベルが表示されます。

ありがとう!

回答:


155

あなたは+迅速な修正が必要です:D

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      content_tag(:label,label) + # Note the + in this line
      text_field_tag(name,'', :class => 'medium new_value')
    end
  end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

のブロック内にはcontent_tag :div、最後に返された文字列のみが表示されます。


1
タイプミス(コメントのみで、やや混乱) - 「ではない電子本のラインで+を」
Chowlett

それを追加した後、構文エラーが発生します:構文エラー、予期しないtIDENTIFIER、kDOまたは '{'または '(' text_field_tag name、 '' 、: class => 'medium new_value' ^
christo16

2
これは汚い感じがします...それは、ヘルパーが複数のコンテンツタグを作成するためのアンチパターンだからですか?
Erik Trautman 2014

私にとってはうまくいきませんでしたconcat、他の答えが示唆するように使用しなければなりませんでした
Dex

55

concatメソッドを使用することもできます。

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      concat(content_tag(:label,label))
      concat(text_field_tag(name,'', :class => 'medium new_value'))
    end
  end
end

出典:Rails3にcontent_tagをネストする


concat行が1行である限り、これは私にとってはうまくいきました。しかし、私はそれで長い間遊んでいなかったので、おそらくそれを複数行にする方法があります
TerryS 2013

これは、html_safeの問題を考慮するとより良い方法になります。+非htmlsafe文字列間で使用すると、すべてが非htmlsafeになります
Tian Chen

フォームビルダークラス内にいる場合は、次のようになります@template.concat
elquimista 2018年

私はそれがよりクリーンな解決方法だと思います+。より読みやすいとRubocop好きではない+
escanxr

2

変数と連結を使用して、より深いネストを支援します。

def billing_address customer
  state_line = content_tag :div do
    concat(
      content_tag(:span, customer.BillAddress_City) + ' ' +
      content_tag(:span, customer.BillAddress_State) + ' ' +
      content_tag(:span, customer.BillAddress_PostalCode)
    )
  end
  content_tag :div do
    concat(
      content_tag(:div, customer.BillAddress_Addr1) +
      content_tag(:div, customer.BillAddress_Addr2) +
      content_tag(:div, customer.BillAddress_Addr3) +
      content_tag(:div, customer.BillAddress_Addr4) +
      content_tag(:div, state_line) +
      content_tag(:div, customer.BillAddress_Country) +
      content_tag(:div, customer.BillAddress_Note)
    )
  end
end

1

ネストされたコンテンツタグを反復で構築することは少し異なり、毎回私を取得します...これが1つの方法です:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.