表中的fields_for产生技术上不正确的HTML

时间:2011-07-06 20:32:55

标签: ruby-on-rails forms views associations fields-for

当我使用如下构造时:

<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元素中?

3 个答案:

答案 0 :(得分:3)

我认为如果手动打印隐藏字段将不会打印。你能试试吗?

<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>

答案 1 :(得分:0)

fields_for方法将隐藏的标识<input>连接到它捕获的块的末尾。因此,如果您将<% end %>标记放在第二个</td>之前,则应该得到您想要的结果。

答案 2 :(得分:0)

这更像是评论(但我似乎无法直接评论)。只是想注意Dogbert的答案对我有用。格式错误的html似乎并不担心大多数浏览器...直到我尝试在IE8中使用jquery ui sortable,这导致了许多问题(包括崩溃)。无论如何,明确地将id包含在td内的隐藏字段中似乎是要走的路。如果对象被持久化,您可能只想考虑这样做(否则隐藏字段没有值,根据您的代码,这可能是也可能不是问题)。添加检查以查看对象是否持久化可能看起来像(在上面的例子中):

<% if gl.object.persisted? %>
  <td><%= gl.hidden_field :id %></td>
<% end %>