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, то отображается метка.

Благодаря!

christo16
источник

Ответы:

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
Опечатка (только в комментарии, но немного
сбивающая с
После добавления этого я получаю синтаксическую ошибку: синтаксическая ошибка, неожиданный 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 была на одной строке. Однако я не долго играл с ним, так что, вероятно, есть способ сделать это многострочным
TerryS
это будет лучший способ, учитывая проблему html_safe. использование +строки между non-htmlsafe сделает все не-htmlsafe
Тиан Чен
Если вы находитесь внутри класса конструктора форм, это должно быть@template.concat
elquimista
Я думаю, что это более чистый способ решения проблемы +. Более читаемый, а 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
Шон М
источник