如何更改fields_for生成的html标记和类?

Hec*_*eal 10 ruby-on-rails fields-for ruby-on-rails-3 simple-form

这是一个简单的问题,我有点惭愧地问,但是我一直在撞墙并在导轨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>
Run Code Online (Sandbox Code Playgroud)

生成的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>
Run Code Online (Sandbox Code Playgroud)

我想要做的是将<div class="fields">包装器标签更改为<li>.

文档说您可以将选项传递给fields_for,但是不清楚您可以传递哪些选项,也许您可​​以更改此包装器标记?

可能是覆盖一个函数,有点像ActionView::Base.field_error_proc表单中的错误.

快速编辑:我忘了提到我正在使用simple_form生成此表单.我尝试在simple_form.rb配置文件中查找自定义方法,但我没有看到任何方法.

解决方案 经过进一步调查后,结果表明表单也使用了nested_form gem来生成表单(不仅仅是simple_form).这个生成器导致fields_for被包装在div标签中.谢谢大家的建议!

lul*_*ala 11

以下禁用包装器:

f.fields_for :images, wrapper:false do |image_builder|
Run Code Online (Sandbox Code Playgroud)

然后你可以在构建器块中添加自己的包装器.

  • 我很惊讶地看到nested_form没有给你一个选项[:class]来改变它.它很难编码为'fields'[here](https://github.com/ryanb/nested_form/blob/master/lib/nested_form/builder_mixin.rb#L91). (2认同)

Mar*_*hen 2

一个便宜的解决方案只是将<li>标签添加到表单中,例如:

<%= f.fields_for :images do |image_builder| %>
 <li><%= render "images/form", :f => image_builder %></li>
<% end %>
Run Code Online (Sandbox Code Playgroud)

我不确定您是否可以通过将一些参数传递给 来完全消除 div 标签field_for。但我认为你可以通过传递 html 块来更改 div 类或 id 的名称,如下所示form_for

<%= form_for @image, :as => :post, :url => post_image_path, 
   :html => { :class => "new_image", :id => "new_image" } do |f| %>
Run Code Online (Sandbox Code Playgroud)