Динамически генерируемые рельсы fields_for не воспринимаются как входные данные form_tag - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь создать несколько объектов в одной форме. Это не отношения родитель-потомок, все объекты одинаковы.

Когда код выглядит следующим образом, он работает просто отлично.

<%= form_tag create_object_path, id: "create-object-form" do %>
  <%= render "admins/object_fields" %>
  <!-- repeat render any number of times -->
<% end %>

# where the render looks like this:
<%= fields_for "objects[]" do |f| %>
  <tr class="new-object">
    <td><%= f.text_field :name %></td>
  </tr>
<% end %>

Один из способов проверить это то, что в консоли $("#create-object-form").serializeArray() правильно возвращает количество полей ввода в зависимости от того, сколько object_fields было обработано.

Однако, когда рендеринг вызывается динамически, ни одно из динамически добавленных fields_for show в представлении. А вызов $("#create-object-form").serializeArray() возвращает только 2 поля, utf8 и authenticity_token, которые автоматически генерируются form_tag. Код, который не работает

<%= form_tag create_object_path, id: "create-object-form" do %>
  <!-- render called by JS -->
<% end %>

<button id="add-object">Add</button>

$("#add-object").click(function() {
  $.ajax({})...
  // correctly fetches and renders the partial on the page in the correct spot.
})

# where the render STILL looks like this, no change:
<%= fields_for "objects[]" do |f| %>
  <tr class="new-object">
    <td><%= f.text_field :name %></td>
  </tr>
<% end %>

1 Ответ

0 голосов
/ 18 апреля 2020

Ответ интересный. Я не понимаю, почему, и не проводил тонны экспериментов на этом, приглашаю кого-нибудь еще добавить.

Вопросу не хватало некоторого контекста. Входные данные были в строках таблицы, поэтому код на самом деле выглядел так:

<table>
  <thead>...content...</thead>
  <%= form_tag form_path, id: "form" do %>
    <tbody>
      <!-- either pre-rendered or dynamically generated trs with input fields -->
    </tbody>
    <tbody>
      <tr>
        <td colspan="3">
          <button id="submit">Submit</button>
        </td>
      </tr>
    </tbody>
  <% end %>
</table>

form_tag, обернутый вокруг tbody, который содержал поля trs с input. В этой версии кода только предварительно обработанные входные данные были получены при отправке или .serializeArray(), как упоминалось выше.

Однако, если я переместу form_tag за пределы table тег, тогда это работает; то есть, динамически добавленные trs с input полями успешно подобраны при отправке или .serializeArray().

Опять же я не знаю почему, не смог найти документацию, предполагающую, что это ожидаемое поведение, так что не стесняйтесь, дайте мне знать. Спасибо!

Рабочий код:

<%= form_tag form_path, id: "form" do %>
  <table>
    <thead>...content...</thead>
    <tbody>
      <!-- either pre-rendered or dynamically generated trs with input fields -->
    </tbody>
    <tbody>
      <tr>
        <td colspan="3">
          <button id="submit">Submit</button>
        </td>
      </tr>
    </tbody>
  </table>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...