当我使用这样的结构时:
<table>
<%= f.fields_for :group_locations do |gl| %>
<tr>
<td><%= gl.label :group_id %></td>
<td><%= gl.select :group_id, paths %></td>
</tr>
<% end %>
</table>
我在浏览器(Safari)中得到表(<input> is not allowed inside <tbody>. Inserting <input> before the <table> instead.
)中的每一行的错误,这是由于隐藏的<input>
用于关联的id被放置在</tr>
之后。我怎样才能使id的<input>
出现在一个TD元素中?
我认为隐藏字段不会被打印,如果你手动打印它。你能试试这个吗?
<table>
<tr>
<%= f.fields_for :group_locations do |gl| %>
<td><%= gl.hidden_field :id %></td>
<td><%= gl.label :group_id %></td>
<td><%= gl.select :group_id, paths %></td>
<% end %>
</tr>
</table>
fields_for
方法将隐藏的id <input>
连接到它捕获的块的末尾。所以,如果你把<% end %>
标签放在第二个</td>
之前,你应该得到你想要的结果。
这更像是一个评论(但我似乎无法直接评论)。我只是想说道伯特的答案对我有用。大多数浏览器似乎并不担心格式错误的html……直到我尝试在IE8中对表格使用jquery ui sortable,这导致了许多问题(包括崩溃)。无论如何,在td的隐藏字段中显式地包含id似乎是可行的方法。如果对象是持久化的,您可能希望只考虑这样做(否则隐藏字段没有值,这可能是一个问题,也可能不是,这取决于您的代码)。添加一个检查来查看对象是否被持久化可能看起来像(在上面的例子中):
<% if gl.object.persisted? %>
<td><%= gl.hidden_field :id %></td>
<% end %>