AGGIORNATO: Sto tentando di aggiungere/rimuovere campi modulo a un modulo annidato che coinvolge più modelli. Ho visto il railscast "Dynamic Forms" di Ryan Bates e ho fatto riferimento a this article utilizzando lo Cocoon Gem. Seguendo questo articolo, tutto ha funzionato perfettamente, tranne che per child_index. Child_index è presente solo nel primo campo di immissione :kid
(:name
) e nei primi campi di immissione :pet
(:name
e :age
). Quindi torna a un token di autenticità per i campi aggiunti.Rails 4: aggiunta child_index ai campi modulo aggiunti dinamicamente (nidificati) con Cocoon Gem
Ho rimosso tutti i metodi JS e helper e invece sto utilizzando alcuni dei metodi Cocoon che sono stati creati in JS.
Ho risolto il problema in cui facendo clic su "Aggiungi" aggiungerei due campi anziché uno rimuovendo = javascript_include_tag :cocoon
dal file application.html.erb
.
Ho provato ad aggiungere jQuery e form helper ma non sono sicuro di aver inserito il codice correttamente.
(ho cambiato gli oggetti del modello per rendere i rapporti più chiari)
file di parent.rb:
class Parent < ActiveRecord::Base
has_many :kids
has_many :pets, through: :kids # <<<<<< ADDED KIDS USING 'through:'
lima kid.rb: file di
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
T il suo è il mio file _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 %>
Questo è il mio file _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>
Questo è il mio file _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>
Would Faccio la stessa cosa per Class come ho fatto per l'insegnante? Ho una versione in qualche modo funzionante anche se ho bisogno di avere un child_index coinvolto da qualche parte perché penso che sia solo assegnando un token di autenticità piuttosto che un id. – BB123
Quindi ho seguito [questo esempio] (https://hackhands.com/building-has_many-model-relationship-form-cocoon/) utilizzando la [Cocoon Gem] (https://github.com/nathanvda/cocoon) e tutto sembra funzionare bene, tranne quando clicco sul link "Aggiungi", aggiunge due campi piuttosto che uno solo. Penso che potrebbe essere qualcosa in corso con il mio controller ma non ne sono sicuro. Inoltre, non utilizzo alcun metodo JS o Helper. La mia preoccupazione principale è che i campi non mi diano un child_index. Piuttosto mi sta ancora dando quello che penso sia un token di autenticità (un mucchio di numeri casuali). @richpeck – BB123
Sarà probabilmente un problema con i turbolinks. Prova ad aggiornare la pagina e a farlo di nuovo, se continua a inviare due richieste, dovremo capire i tuoi binding JS –