Как изменить тег 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