2015-03-26 15 views
32

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 
+1

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

+0

@Sontya Grazie per la risposta. Penso che mi sto avvicinando, anche se non ancora abbastanza. – Neil

+1

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

risposta

Problemi correlati