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
Це відчувається брудно ... це тому, що це анти-шаблон для помічника для створення декількох тегів вмісту?
Ерік Траутман,

Не спрацював для мене, довелося використовувати, concatяк пропонують інші відповіді
Декс

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

Джерело: Вкладання тегу content_tag в Rails 3


Це працювало для мене, поки рядок concat знаходився на 1 рядку. Однак я довго не грався з ним, тому, мабуть, є спосіб зробити це багаторядковим
TerryS

це буде кращий спосіб розглянути проблему html_safe. використання +між не-htmlsafe рядком зробить все, що не htmlsafe
Тянь Чень,

Якщо ви знаходитесь у класі @template.concat
конструктора

Я думаю, що це більш чисте рішення, ніж це зробити +. Більше читабельний і Rubocop не любить+
escanxr

2

Я використовую змінну та concat, щоб допомогти глибше вкластися.

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

побудова вкладених тегів вмісту за допомогою ітерації дещо відрізняється, і мене змушує кожного разу ... ось один із методів:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.