No update_attributes de trabajo para muchos-a-muchos atributos anidados
-
28-09-2019 - |
Pregunta
Tengo algunos atributos anidados en algunos modelos tales como:
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
cuando llamo @employee.update_attributes(params[:employee])
de mi controlador se actualiza todo excepto la dirección. Sin embargo si raise params.inspect
y copia que en una variable en escritura / consola, que hace el trabajo. Ejemplo:
>> 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"=>"first@example.com"}},
?> "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">
Así se puede ver la dirección era actualizada de la escritura / consola, pero no de mi controlador.
Si esta es la sobrecarga de información, a continuación, la versión simple de esta pregunta es:
¿Por qué no se actualiza mi dirección?
Solución
Yo era capaz de mirar por último en este problema hoy en día. Fue una solución rápida que me topé porque yo estaba tratando con otro problema: las direcciones no estaban siendo eliminados cuando he eliminado empleados, usuarios o personas. La solución es la siguiente:
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
Otros consejos
Tenía este comportamiento extraño silencio por una razón diferente. En mi modelo que tenía
accepts_nested_attributes_for :items, :allow_destroy => true, :reject_if => proc { |attrs| attrs['count'] == '0' || ( attrs['article_id'] == '' && attrs['quantity_id'] == '') }
Me quita el: reject_if parte, y funcionó de nuevo
.