Rails 4: Добавление child_index в динамически добавляемые (вложенные) поля формы с помощью Cocoon Gem
ОБНОВЛЕНО: я пытаюсь добавить / удалить поля формы во вложенную форму, включающую несколько моделей. Я видел Railscast "Dynamic Forms" Райана Бейтса, и я упомянулЭта статья с использованиемCocoon Gem, После этой статьи все заработало отлично, за исключением child_index. Child_index присутствует только на первом:kid
поле ввода (:name
) и первый:pet
поля ввода (:name
а также:age
). Затем он возвращается к токену аутентификации для добавляемых полей.
Я удалил все JS и вспомогательные методы, и вместо этого я использую некоторые методы Cocoon, встроенные в JS.
Я исправил проблему, когда нажатие кнопки «Добавить» добавило бы два поля вместо одного, удалив= javascript_include_tag :cocoon
отapplication.html.erb
файл.
Я попытался добавить jQuery и помощники форм, но я не уверен, что правильно ввел код.
(Я изменил объекты модели, чтобы сделать отношения более ясными)
Файл parent.rb:
class Parent < ActiveRecord::Base
has_many :kids
has_many :pets, through: :kids # <<<<<< ADDED KIDS USING 'through:'
файл kid.rb:
class Kid < ActiveRecord::Base
belongs_to :parent
has_many :pets
accepts_nested_attributes_for :pets, reject_if: :all_blank, allow_destroy: true
validates :name, presence: true
файл pet.rb:
class Pet < ActiveRecord::Base
belongs_to :kid
validates :name, presence: true
validates :age, presence: true
Это мой файл _form.html.erb:
<%= form_for @parent do |f| %>
<% if @parent.errors.any? %>
<div class="alert alert-danger">
<h3><%= pluralize(@student.errors.count, 'Error') %>: </h3>
<ul>
<% @student.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="inline">
<div>
<%= f.fields_for :kids do |kid| %>
<%= render 'kid_fields', f: kid %>
<% end %>
<div>
<%= link_to_add_association "Add Kid", f, :kids, id: 'add_kid',
'data-association-insertion-method' => 'before',
'data-association-insertion-traversal' => 'closest' %>
</div>
<% end %>
</div>
</div>
<div class="form-actions">
<%= f.submit 'Create Parent', class: 'btn btn-primary' %>
</div>
<% end %>
Это мой файл _kid_fields.rb:
<div class="nested-fields">
<div class="kid-fields inline">
<%= f.hidden_field :_destroy, class: 'removable' %>
<%= f.text_field :name, class: 'form-control', placeholder: 'Kid's Name', id: 'kid-input' %>
<div>
<%= link_to_remove_association 'Remove Kid', f %>
</div>
<%= f.fields_for :pets do |pet| %>
<%= render 'pet_fields', f: pet %>
<% end %>
</div>
<div>
<%= link_to_add_association "Add Pet", f, :pets, id: 'add_pet',
'data-association-insertion-method' => 'before' %>
</div>
</div>
Это мой файл _pet_fields.rb:
<div class="nested-fields">
<div class="pet-fields">
<%= f.hidden_field :_destroy, class: 'removable' %>
<%= f.text_field :name, placeholder: 'Pet Name', id: 'pet-name-input' %>
<%= f.text_field :age, placeholder: 'Pet Age', id: 'pet-age-input' %>
<%= link_to_remove_association 'Remove Pet', f, id: 'remove_pet' %>
</div>
</div>