ruby-on-rails - Ruby on Rails field_for 表单助手问题

标签 ruby-on-rails xhtml

我在循环中使用 field_for 表单助手:

<% f.fields_for :permissions do |permission_form| %>
    <tr>
      <td><%= permission_form.object.security_module.name %><%= permission_form.hidden_field(:security_module_id) %></td>
      <td><%= permission_form.object.security_module.description %></td>
    <tr>
<% end %>

以上代码的结果输出是这样的:

    <input id="role_permissions_attributes_0_id" name="role[permissions_attributes][0][id]" type="hidden" value="76" />
    <tr>
      <td>Diary<input id="role_permissions_attributes_0_security_module_id" name="role[permissions_attributes][0][security_module_id]" type="hidden" value="13" /></td>
       <td>Access to the Diary Module</td>
    </tr>
    <!-- next input field then <tr> tag -->

此标记的问题是输入标签落在 tr 标签之外,这会导致 XHTML 的验证问题。

有谁知道如何让 input 标签位于 tr 标签内,从而为我提供有效的 XHTML 1.0 STRICT 标记?

谢谢

最佳答案

如果您查看 Rails 源代码,您会发现这一点。

# in actionpack/lib/action_view/helpers/form_helper.rb
def fields_for_nested_model(name, object, args, block)
  if object.new_record?
    @template.fields_for(name, object, *args, &block)
  else
    @template.fields_for(name, object, *args) do |builder|
      @template.concat builder.hidden_field(:id)
      block.call(builder)
    end
  end
end

请注意,它直接在此处添加隐藏字段,并且看起来没有任何选项可以更改此行为。最简单的事情可能是创建您自己的自定义表单构建器。

# in lib/no_id_form_builder.rb
class NoIdFormBuilder < ActionView::Helpers::FormBuilder
  private
  def fields_for_nested_model(name, object, args, block)
    @template.fields_for(name, object, *args, &block)
  end
end

然后在您的表单中使用它。您需要手动添加 id 字段。

<% f.fields_for :permissions, :builder => NoIdFormBuilder do |permission_form| %>
  <tr>
    <td>
      <%= permission_form.object.security_module.name %>
      <%= permission_form.hidden_field(:security_module_id) %>
      <%= permission_form.hidden_field(:id) unless permission_form.object.new_record? %>
    </td>
    <td><%= permission_form.object.security_module.description %></td>
  <tr>
<% end %>

您可能需要就此提交灯塔票。也许 :skip_id_field 选项可以用于 fields_for 来执行此操作。

关于ruby-on-rails - Ruby on Rails field_for 表单助手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236416/

相关文章:

ruby-on-rails - rails 5 : NoMethodError: undefined method `helper' for MyMailer

javascript - JQuery 字体大小脚本问题

javascript - 将数据属性添加到 selectize.js 选项

ruby-on-rails - 如何让 Rails 引擎与主应用程序交互

html - 如何使表单元素的样式和功能在所有浏览器中都不会中断?

javascript - JS函数执行顺序

Jquery 选项卡式导航导致下面的元素出现 float 问题

html - FF 中格式不正确的错误消息

html - 将数据属性存储在 'class' 与 HTML5 数据属性中

ruby-on-rails - yyyy-mm-ddThh :mm:ss. 000Z Ruby 中的日期格式