CẬP NHẬT: Tôi đang cố gắng thêm/xóa các trường biểu mẫu vào một biểu mẫu lồng nhau liên quan đến nhiều mô hình. Tôi đã nhìn thấy "Các hình thức động" được railscast bởi Ryan Bates và tôi đã gọi this article bằng cách sử dụng Cocoon Gem. Sau bài viết đó đã làm mọi thứ hoạt động hoàn hảo ngoại trừ child_index. Child_index chỉ xuất hiện trên trường nhập :kid
đầu tiên (:name
) và các trường nhập :pet
đầu tiên (:name
và :age
). Sau đó, nó quay trở lại một mã thông báo xác thực cho các trường được thêm vào.Rails 4: Thêm child_index vào các trường biểu mẫu được thêm động (lồng nhau) với Cocoon Gem
Tôi đã xóa tất cả các phương thức JS và trình trợ giúp và thay vào đó tôi sử dụng một số phương thức Cocoon đã được xây dựng trong JS.
Tôi đã khắc phục sự cố khi nhấp vào "Thêm" sẽ thêm hai trường thay vì một trường bằng cách xóa = javascript_include_tag :cocoon
khỏi tệp application.html.erb
.
Tôi đã thử thêm jQuery và người trợ giúp biểu mẫu nhưng tôi không chắc chắn tôi đã nhập mã chính xác chưa.
(Tôi đã thay đổi các đối tượng mô hình để làm cho mối quan hệ rõ ràng hơn)
parent.rb file:
class Parent < ActiveRecord::Base
has_many :kids
has_many :pets, through: :kids # <<<<<< ADDED KIDS USING 'through:'
kid.rb tập tin: file
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 của ông là tập tin _form.html.erb tôi:
<%= 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 %>
Đây là tập tin _kid_fields.rb tôi:
<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>
Đây là tập tin _pet_fields.rb tôi:
<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 Tôi chỉ làm điều tương tự cho lớp như tôi đã làm cho Sư phụ? Tôi có một phiên bản hơi làm việc mặc dù tôi _do_ cần phải có một child_index tham gia một nơi nào đó bởi vì tôi nghĩ rằng nó chỉ là chỉ định một thẻ xác thực hơn là một id. – BB123
Vì vậy, tôi đã theo [ví dụ này] (https://hackhands.com/building-has_many-model-relationship-form-cocoon/) bằng [Cocoon Gem] (https://github.com/nathanvda/cocoon) và mọi thứ dường như hoạt động tốt, ngoại trừ khi tôi nhấp vào liên kết "Thêm", nó thêm hai trường thay vì chỉ một. Tôi nghĩ rằng nó có thể là một cái gì đó đang xảy ra với bộ điều khiển của tôi nhưng tôi không chắc chắn. Tôi cũng không sử dụng bất kỳ phương thức JS hoặc Trình trợ giúp nào. Mối quan tâm chính của tôi là các trường không cho tôi một child_index. Thay vào đó nó vẫn cho tôi những gì tôi nghĩ là một mã thông báo xác thực (một loạt các số ngẫu nhiên). @richpeck – BB123
Nó có thể sẽ là một vấn đề turbolinks. Hãy thử làm mới trang và thực hiện lại - nếu nó tiếp tục gửi hai yêu cầu, chúng tôi sẽ phải tìm ra các ràng buộc JS của bạn –