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。否则,答案就太完美了。当时,我还没有收到评论权限:)不允许进入,我想它必须进入