domanda inizialeRails 4 Forma: has_many attraverso: caselle di controllo
due risorse: users
e animals.
Quando si crea un utente, il cliente seleziona le caselle di controllo per dire quanti animali hanno.
Quando il modulo utente viene inviato, non dovrebbe creare solo un nuovo record user
, ma dovrebbe anche creare una serie di record nella tabella di join ricca animal_users
per rappresentare ciascuna delle caselle di controllo selezionate dal client.
Il problema è che non sto specificando qualcosa correttamente per la parte checkbox all'interno del modulo. Ho esaminato lo checkbox_tag API, lo Rails Guides on Forms e molti siti Web e post StackOverflow.
Grazie in anticipo, codice qui sotto:
Codice originale (codice di risposta, più in basso):
modelli:
#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
La forma 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 %>
params forti all'interno del codice risposta users_controller.rb
def user_params
params.require(:user).permit(:name, animal_users_attributes: [:_destroy, :id, :user_id, :animal_id])
end
qui:
modelli:
#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
Il user
forma:
#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 %>
params forti all'interno del users_controller.rb
def user_params
params.require(:user).permit(:name, animal_ids: [])
end
E proprio per amor di completezza, ecco cosa ho s passato nel server al momento modulo di presentazione:
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
Nel modello "Utente" provare a utilizzare "accept_nested_attributes_for: animal_users", dare un'occhiata a questo post http://stackoverflow.com/questions/21983131/rails-4-nested-attributes-and-has-many-through -associaton-in-a-form – Sontya
@Sontya Grazie per la risposta. Penso che mi sto avvicinando, anche se non ancora abbastanza. – Neil
cambia la visualizzazione '<% Animal.all.each do | animal | %> \t <% = f.fields_for: animal_users do | ff | %> \t \t <% = ff.check_box: animal_id, {}, animal.id%> \t \t <% = animale.nome%> \t <% end %> ' – Sontya