【问题标题】:How do I change the html tag and class generated by fields_for?如何更改fields_for生成的html标签和类?
【发布时间】:2012-01-20 02:18:42
【问题描述】:

这是一个我有点不好意思问的简单问题,但我一直在用头撞墙并浏览 rails 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>

我想要做的实际上是将&lt;div class="fields"&gt;包装标签更改为&lt;li&gt;

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

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

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

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

【问题讨论】:

  • field_error_proc 方法是规范的。 (IIRC 需要注意的是它的参数是一个 HTML 字符串而不是有用的东西,但我可能会将它与其他东西混淆。)

标签: ruby-on-rails ruby-on-rails-3 simple-form fields-for


【解决方案1】:

以下禁用包装器:

f.fields_for :images, wrapper:false do |image_builder|

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

【讨论】:

  • 我很惊讶地看到 nested_form 没有给你一个 options[:class] 来改变它。它被硬编码为“字段”here
【解决方案2】:

一个便宜的解决方案就是将&lt;li&gt;标签添加到如下形式:

<%= f.fields_for :images do |image_builder| %>
 <li><%= render "images/form", :f => image_builder %></li>
<% end %>

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

<%= form_for @image, :as => :post, :url => post_image_path, 
   :html => { :class => "new_image", :id => "new_image" } do |f| %>

【讨论】:

  • 我在发布之前尝试了您的第一个建议,但 fields_for 调用实际上将其中的任何内容包装在上述 div 标签中。所以我会得到类似
    • ..
  • 好的,对不起。这实际上是答案。问题不在于 simple_form ......而是表单实际上也使用了nested_form 插件......所以它是 simple_NESTED_form_for 标签,这导致字段被包装在 div 中......
【解决方案3】:

你说你正在使用 simple_form 那么你应该说&lt;%= 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 类:

config/initializers/simple_form.rb

# CSS class to add to all wrapper tags.
config.wrapper_class = :input

【讨论】:

  • 感谢您的回答,不幸的是,SimpleForm.wrapper_tag 仅影响单个输入:/ fields_for 将我的整个嵌套表单包装在
    标记中。嵌套形式本身的输入是好的。
  • 问题是表单也使用了nested_form gem 生成器......这会导致 fields_for 调用被包装。谢谢!
猜你喜欢
相关资源
最近更新 更多
热门标签