fields_for в таблице выдает технически некорректный HTML - PullRequest
2 голосов
/ 07 июля 2011

Когда я использую такую ​​конструкцию, как:

<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> для идентификатора ассоциации, помещенным после </tr>. Как я могу заставить id <input> появляться внутри одного из элементов TD?

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Я думаю, что скрытое поле не будет напечатано, если вы напечатаете его вручную.Не могли бы вы попробовать это?

<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>
0 голосов
/ 24 февраля 2013

Это скорее комментарий (но я не могу комментировать напрямую).Просто хотел отметить, что ответ Догберта сработал для меня.Неправильно созданный html, похоже, не беспокоил большинство браузеров ... пока я не попытался использовать jquery ui, сортируемый по таблице в IE8, что вызвало ряд проблем (включая сбой).В любом случае, явное включение идентификатора в скрытое поле внутри td кажется правильным.Вы можете рассмотреть возможность сделать это только в том случае, если объект сохраняется (в противном случае скрытое поле не имеет значения, что может быть или не быть проблемой в зависимости от вашего кода).Добавление проверки, чтобы видеть, сохраняется ли объект, может выглядеть (в вышеупомянутом случае):

<% if gl.object.persisted? %>
  <td><%= gl.hidden_field :id %></td>
<% end %>
0 голосов
/ 07 июля 2011

Метод fields_for объединяет скрытый идентификатор <input> до конца блока, который он захватывает. Итак, если вы поместите свой тег <% end %> перед вторым </td>, вы должны получить желаемый результат.

...