Ruby-on-Rails字段\用于表单帮助器问题

Ruby-on-Rails字段\用于表单帮助器问题,ruby-on-rails,xhtml,Ruby On Rails,Xhtml,我将表单帮助器的字段_用于循环: <% f.fields_for :permissions do |permission_form| %> <tr> <td><%= permission_form.object.security_module.name %><%= permission_form.hidden_field(:security_module_id) %></td> <td&

我将表单帮助器的字段_用于循环:

<% 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的验证问题

有人知道如何让输入标记位于tr标记内,从而为我提供有效的XHTML1.0严格标记吗


谢谢,如果你看一下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
#在lib/no_id_form_builder.rb中
类NoIdFormBuilder
然后在你的表格中使用这个。您需要手动添加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 %>
noidformbuilderdo |许可|表格|%>
你可能想提交一张灯塔票。可能会有一个
:跳过id\u字段
选项到
字段
,这样做。

轻微更正:


:builder选项需要在表单_中包含字段_,而不是字段_。

从2.3.5开始,有一种解决方法可用。如果显式放置:id字段,它不会为您隐式添加:

<% form_for @foo do |f| %> 
<table> 
  <tbody> 
    <% f.fields_for :bars do |bf| %> 
      <tr>
        <td>
          <%= bf.hidden_field :id %>
          <%= bf.text_field :name %>
        </td> 
      </tr> 
    <% end %> 
  </tbody> 
</table> 
<% end %>


谢谢你,瑞安!这绝对有帮助!这周我会把这个记录在灯塔上。回答得好!肖恩,我想你忘了投票了(我到这里的时候是0)。正如michaeljohnston所说(我想这里应该是一个注释而不是一个单独的答案),builder选项的形式为,而不是fields。否则,答案就太完美了。当时,我还没有收到评论权限:)不允许进入,我想它必须进入