Как изменить тег html и класс, сгенерированный полями_for?
Это простой вопрос, который мне стыдно спрашивать, но я ударился головой о стену и без каких-либо успехов перешел через рельсы 3:/
Итак, вот что:
Когда я использую помощник fields_for
, он обертывает сгенерированные поля тегом <div class="fields"> ... </div>
.
поэтому мой код
<ul class="block-grid two-up">
<%= f.fields_for :images do |image_builder| %>
<%= render "images/form", :f => image_builder %>
<% end %>
</ul>
а сгенерированный html:
<ul class="block-grid two-up">
<div class="fields">
<div>
<label for="company_images_attributes_0_image"> Image</label>
<input id="company_images_attributes_0_image"
name="company[images_attributes][0][image]" type="file">
</div>
</div>
<div class="fields">
<div>
<label for="company_images_attributes_1_image"> Image</label>
<input id="company_images_attributes_1_image"
name="company[images_attributes][1][image]" type="file">
</div>
</div>
</ul>
Что я хочу сделать, это изменить тег обертки <div class="fields">
на <li>
.
В документации говорится, что вы можете передавать параметры в поля fields_for, но неясно, какие параметры вы можете передать, возможно, вы можете изменить этот тег обертки?
Возможность может заключаться в переопределении функции, вроде ActionView::Base.field_error_proc
, когда в форме есть ошибка.
Быстрое редактирование: я забыл упомянуть, что я использую simple_form для создания этой формы. Я попытался найти в конфигурационном файле simple_form.rb
способ настройки, но я не видел никакого способа сделать это.
Решение
После дальнейшего исследования выясняется, что форма использовала камень nested_form, чтобы сгенерировать форму (а не только simple_form). Этот генератор вызывал поля, которые должны быть завернуты в тег div. Спасибо всем за их предложения!
Ответы
Ответ 1
Дешевое решение просто добавило бы тег <li>
в форму вроде:
<%= f.fields_for :images do |image_builder| %>
<li><%= render "images/form", :f => image_builder %></li>
<% end %>
Я не уверен, что вы можете полностью исключить тег div, передав некоторые параметры в field_for
. Но я думаю, вы можете изменить имя div-класса или id, передав html-блок, как в form_for
:
<%= form_for @image, :as => :post, :url => post_image_path,
:html => { :class => "new_image", :id => "new_image" } do |f| %>
Ответ 2
Следующее отключает оболочку:
f.fields_for :images, wrapper:false do |image_builder|
то вы можете добавить свою собственную оболочку в блок строителя.
Ответ 3
Вы сказали, что используете simple_form, тогда вы должны сказать <%= f.simple_fields_for..
. Пробовали ли вы использовать параметр wrapper_html
:
<%= f.input :name, :label_html => { :class => 'upcase strong' },
:input_html => { :class => 'medium' }, :wrapper_html => { :class => 'grid_6 alpha' } %>
Изменить 1:
Из документации SimpleForm:
Упаковочный
SimpleForm позволяет добавить оболочку, содержащую метку, ошибку, подсказку и ввод. Первым шагом является настройка тега обертки:
SimpleForm.wrapper_tag = :p
И теперь вам больше не нужно обматывать ваши вызовы f.input:
<%= simple_form_for @user do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= f.button :submit %>
<% end %>
Изменить 2:
И есть этот вариант конфигурации, с помощью которого вы можете сказать, какой класс css использовать с элементами оболочки:
конфигурации/инициализаторы/simple_form.rb
# CSS class to add to all wrapper tags.
config.wrapper_class = :input