Вложенная форма Rails - элементы динамически добавляются, все получают нулевой индекс - PullRequest
3 голосов
/ 16 марта 2012

У меня проблемы с вложенной формой. Я использую код Райана Бейтса. Фрагмент Gemfile:

gem "nested_form",: git => 'https://github.com/ryanb/nested_form.git'

Проблема в том, что когда я пытаюсь использовать * link_to_add *, я получаю новый элемент, который выглядит нормально, но он не работает, потому что он получает новый индекс 0 вместо «случайного» индекса, основанного на текущем времени что nested_form.js должен генерировать. Каждый элемент, который я добавляю, получает одинаковый индекс 0. Поэтому я не могу добавить новый элемент (или сохраняется только последний новый, в зависимости от исходного состояния модели).

Поведение аналогично с новым родительским объектом и при редактировании родительского объекта.

Я почти уверен, что делаю что-то не так, поскольку смог создать новое простое приложение, которое работает. Но я не могу понять, что не так с моим настоящим приложением.

nested_form.js, сгенерированные для моего (рабочего) тестового приложения и моего (не работающего) реального приложения, идентичны. Поэтому я не думаю, что есть проблема с разницей версий.

Я использовал Firebug для пошагового выполнения кода в nested_form.js, но не смог выяснить, почему он генерировал индекс 0 там.

Моя родительская модель имеет это:

курс курса

accepts_nested_attributes_for :levels, :allow_destroy => true
has_many :levels, :dependent => :destroy, :order => :depth

Моя форма создается следующим образом:

<%= nested_form_for(@course) do |f| %>

Часть с вложенным объектом выглядит так:

<%= f.fields_for :levels do |builder| %>
    <tr>
        <td><%= builder.text_field :name %></td>
        <td><%= image_tag(builder.object.icon) unless (builder.object.icon.nil?) %></td>
        <td><%= builder.link_to_remove "Remove" %></td>
    </tr>
<% end %>
   <tr><td><%= f.link_to_add "Add a level", :levels %></td></tr>

Я не вижу никакой разницы между моим кодом и моим рабочим примером (или другими примерами, которые я видел).

У кого-нибудь есть идеи?

UPDATE:

После попытки отладки этого в Firebug я понял, что «чертёж», используемый функцией addFields в nested_form.js, был изменен внутри метода addFields, и поэтому он не вставлял сгенерированный индекс (этот блок был будучи обойденным в моем тестовом приложении). Поэтому я изменил блок, где это происходит, изменив:

if (context) {

до:

if (false)

Это, кажется, исправляет мой симптом от предварительного тестирования, но я чувствую, что в некоторых контекстах (NPI) это могло сломать что-то еще (возможно, с несколькими уровнями вложенности?).

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Хотя я чувствую себя несколько глупо, я думаю, что это может случиться с кем-то еще (и я действительно сказал в своем вопросе, что я, вероятно, делал что-то «неправильно»).

То, что я делал «неправильно»Я использовал поля для разделения областей моей формы.И я давал полевым наборам класс «поля».Нехорошо.Конфликтует с классами генератора форм.

1 голос
/ 23 июня 2015

Я столкнулся с подобной ситуацией, когда у моего родительского объекта не было своих собственных полей:

Carousel has_many Items
<%= f.inputs 'Carousel' do %>
<!-- NOTICE NO FIELDS HERE -->

  <f.fields_for :items, allow_destroy: true do |it| %>
    <%= it.input :media_hash %>
    <%= it.link_to_remove 'Remove item' %>
  <% end %>
  <%= f.link_to_add 'Add item', :items %>
<% end %>

При добавлении поля на мой родительский объект индексы создавались правильно.В моем случае я просто добавил f.input :created_at, as: :hidden к моей карусели.

0 голосов
/ 26 мая 2012

У меня точно такая же проблема (при обновлении, а не при создании), за исключением того, что единственные экземпляры классов "fields" в моем html генерируются помощником fields_for, поэтому я очень расстроен.

Потратили почти весь день на просмотр javascript, но не видите причин, по которым он должен заменить строки "new_" недействительными индексами "0".

Мой хак, который исправил это, добавил проверку в цикле редактирования контента:

for(var i = 0; i < parentNames.length; i++) {
          if (parentIds[i] && parentIds[i] !== "0") {
            content = content.replace(
              new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'),
              '$1_' + parentIds[i] + '_');
           ...
...