[英]Rails 4 Form: has_many through: checkboxes
原始問題
兩種資源: users
和animals.
創建用戶時,客戶端選擇復選框來說明他們有多少動物。
提交用戶表單時,不僅要創建新的user
記錄,還要在animal_users
富連接表中創建一堆記錄來代表客戶端選中的每個復選框。
我認為的問題是我沒有為表單中的復選框部分正確指定某些內容。 我查看了checkbox_tag API 、 Forms 上的Rails 指南以及許多網站和 stackOverflow 帖子。
提前致謝,代碼如下:
原始代碼(答案代碼進一步向下) :
楷模:
#models/user.rb
class User < ActiveRecord::Base
has_many :animals, through: :animal_users
has_many :animal_users
accepts_nested_attributes_for :animal_users, allow_destroy: true
end
#models/animal.rb
class Animal < ActiveRecord::Base
has_many :users, through: :animal_users
has_many :animal_users
end
#models/animal_user.rb
class AnimalUser < ActiveRecord::Base
belongs_to :animal
belongs_to :user
end
user
表格:
#views/users/_form.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div>
<% Animal.all.each do |animal| %>
<label>
<%= check_box_tag "user[animal_ids][]", animal.id, f.object.animals.include?(animal) %>
<%= animal.animal_name %>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
users_controller.rb
強參數
def user_params
params.require(:user).permit(:name, animal_users_attributes: [:_destroy, :id, :user_id, :animal_id])
end
答案代碼在這里:
楷模:
#models/user.rb
class User < ActiveRecord::Base
has_many :animals, through: :animal_users
has_many :animal_users
end
#models/animal.rb
class Animal < ActiveRecord::Base
has_many :users, through: :animal_users
has_many :animal_users
end
#models/animal_user.rb
class AnimalUser < ActiveRecord::Base
belongs_to :animal
belongs_to :user
end
user
表格:
#views/users/_form.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
# Checkbox part of the form that now works!
<div>
<% Animal.all.each do |animal| %>
<%= check_box_tag "user[animal_ids][]", animal.id, f.object.animals.include?(animal) %>
<%= animal.animal_name %>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
users_controller.rb
強參數
def user_params
params.require(:user).permit(:name, animal_ids: [])
end
為了完整起見,這里是表單提交時傳遞到服務器的內容:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xyz=", "user"=>{"name"=>"Neil", "animal_ids"=>["1", "3"]}, "commit"=>"Create User"}
Animal Load (0.2ms) SELECT "animals".* FROM "animals" WHERE "animals"."id" IN (1, 3)
(0.1ms) begin transaction
SQL (0.2ms) INSERT INTO "users" ("created_at", "name", "updated_at") VALUES (?, ?, ?) [["created_at", "2015-03-26 15:29:00.478767"], ["name", "Neil"], ["updated_at", "2015-03-26 15:29:00.478767"]]
SQL (0.1ms) INSERT INTO "animal_users" ("animal_id", "created_at", "updated_at") VALUES (?, ?, ?) [["animal_id", 1], ["created_at", "2015-03-26 15:29:00.479833"], ["updated_at", "2015-03-26 15:29:00.479833"]]
SQL (0.0ms) INSERT INTO "animal_users" ("animal_id", "created_at", "updated_at") VALUES (?, ?, ?) [["animal_id", 3], ["created_at", "2015-03-26 15:29:00.480644"], ["updated_at", "2015-03-26 15:29:00.480644"]]
SQL (0.1ms) UPDATE "animal_users" SET "updated_at" = ?, "user_id" = ? WHERE "animal_users"."id" = 6 [["updated_at", "2015-03-26 15:29:00.481362"], ["user_id", 8]]
SQL (0.1ms) UPDATE "animal_users" SET "updated_at" = ?, "user_id" = ? WHERE "animal_users"."id" = 7 [["updated_at", "2015-03-26 15:29:00.482062"], ["user_id", 8]]
(2.4ms) commit transaction
collection_check_boxes是更好的選擇:
<%= f.collection_check_boxes(:animal_ids, Animal.all, :id, :name) do |animal| %>
<%= animal.label { animal.check_box } %>
<% end %>
<% Animal.all.each do |animal| %>
<label>
<%= check_box_tag "user[animal_ids][]", animal.id, f.object.animals.include?(animal) %>
<%= animal.name %>
</label>
<% end %>
並且您必須在控制器參數上接受帶有 id 數組的哈希值,例如
{ animal_ids: [] }
也許閱讀這會有所幫助: http : //millarian.com/programming/ruby-on-rails/quick-tip-has_many-through-checkboxes/
另一個使用collection_check_boxex 的例子對我來說更容易理解:
<%= f.collection_check_boxes(:animal_ids, Animal.all, :id, :name) do |animal| %>
<div class="form-check">
<%= animal.check_box(class: "form-check-input") %>
<%= animal.label(class: "form-check-label") %>
</div>
<% end %>
它適用於 Rails 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.