2010-10-06 4 views
0

j'ai quelques attributs imbriqués dans certains modèles en tant que tels:update_attributes ne fonctionne pas pour beaucoup à plusieurs attributs imbriqués

class Employee < ActiveRecord::Base 
    has_one :user, :as => :user_role, :dependent => :destroy 
    accepts_nested_attributes_for :user, :allow_destroy => true 
end 

class User < ActiveRecord::Base 
    has_one :person, :as => :person_role, :dependent => :destroy 
    belongs_to :user_role, :polymorphic => true 
    accepts_nested_attributes_for :person, :allow_destroy => true 
end 

class Person < ActiveRecord::Base 
    has_many :address_person_links, :dependent => :destroy 
    has_many :addresses, :through => :address_person_links, :uniq => true, :dependent => :destroy 

    belongs_to :person_role, :polymorphic => true 

    accepts_nested_attributes_for :addresses, :allow_destroy => true 
end 

class AddressPersonLink < ActiveRecord::Base 
    belongs_to :address 
    belongs_to :person 
end 

class Address < ActiveRecord::Base 
    has_many :address_person_links, :dependent => :destroy 
    has_many :people, :through => :address_person_links, :uniq => true 
end 

quand je l'appelle @employee.update_attributes(params[:employee]) de mon contrôleur, il met à jour tout sauf l'adresse. Cependant si je raise params.inspect et copiez cela dans une variable dans le script/console, cela fonctionne. Exemple:

>> e = Employee.find(8) 
=> #<Employee id: 8, active: true, admin: false, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 20:11:20"> 
>>address = a.user.person.addresses[0] 
=> #<Address id: 10, address1: "225 3rd Ave", address2: "", address3: "", city: "Sacramento", state_id: 5, zip_code: "95814", country_id: 1, contact_type_id: 2, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 22:40:06"> 
>> params = {"commit"=>"Update", 
?> "_method"=>"put", 
?> "authenticity_token"=>"sYgfNDbt4SB00WSjJXnpF4FNhRT4HBHcY7W+IENpC/k=", 
?> "id"=>"8", 
?> "employee"=>{"user_attributes"=>{"person_attributes"=>{"addresses_attributes"=>{"0"=>{"address1"=>"225 3rd Ave Suite 777", 
?> "city"=>"Sacramento", 
?> "contact_type_id"=>"2", 
?> "address2"=>"", 
?> "address3"=>"", 
?> "zip_code"=>"95814", 
?> "country_id"=>"1", 
?> "id"=>"10", 
?> "state_id"=>"5"}}, 
?> "prefix"=>"", 
?> "email_addresses_attributes"=>{"0"=>{"contact_type_id"=>"2", 
?> "id"=>"16", 
?> "email"=>"[email protected]"}}, 
?> "id"=>"16", 
?> "last_name"=>"Last", 
?> "suffix"=>"", 
?> "phone_numbers_attributes"=>{"0"=>{"number"=>"9165555555", 
?> "contact_type_id"=>"1", 
?> "extension"=>"", 
?> "id"=>"16"}}, 
?> "first_name"=>"First"}, 
?> "password_confirmation"=>"321321", 
?> "id"=>"16", 
?> "password"=>"321321", 
?> "login"=>"third"}, 
?> "admin"=>"0", 
?> "active"=>"1"}} 
=> # this outputs the hash that was created 
>> e.update_attributes(params["employee"]) # they are no longer symbols but string keys now 
=> true 
>> address 
=> #<Address id: 10, address1: "225 3rd Ave Suite 777", address2: "", address3: "", city: "Sacramento", state_id: 5, zip_code: "95814", country_id: 1, contact_type_id: 2, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 22:40:16"> 

Vous pouvez voir l'adresse a été mis à jour à partir du script/console mais pas de mon contrôleur.

Si cela est la surcharge d'information, la version simple de cette question est:
Pourquoi pas mon adresse soient mis à jour?

+0

Juste un coup dans l'obscurité - que se passe-t-il si vous utilisez 'params [" employé "]' dans le contrôleur? – zetetic

+0

@zetetic, merci pour le commentaire. Je pense que c'est un bug dans les rails. Je vais essayer de reproduire un peu, donc je sais à coup sûr. Voici un billet qui a déjà été posté: https://rails.lighthouseapp.com/projects/8994/tickets/4766-nested_attributes-fails-to-updatedestroy-when-association-is-loaded-between-setting-attributes- et-saving-parent. Je vais essayer votre idée aussi. – DJTripleThreat

Répondre

0

J'ai pu enfin regarder ce problème aujourd'hui. C'était une solution rapide que je suis tombé sur parce que je traitais d'un autre problème: les adresses n'étaient pas supprimées lorsque j'ai supprimé les employés, les utilisateurs ou les personnes. Le correctif est le suivant:

class AddressPersonLink < ActiveRecord::Base 
    # some how adding dependent => destroy fixed the problem 
    # i was having with updating as well. 
    belongs_to :address, :dependent => :destroy 
    belongs_to :person 
end 
0

J'ai eu ce comportement étrange et silencieux pour une raison différente. Dans mon modèle j'avais

accepts_nested_attributes_for :items, :allow_destroy => true, :reject_if => proc { |attrs| attrs['count'] == '0' || (attrs['article_id'] == '' && attrs['quantity_id'] == '') } 

J'ai retiré la partie: reject_if, et cela a fonctionné à nouveau.

Questions connexes