我在某些模型中有一些嵌套属性,例如:
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
当我@employee.update_attributes(params[:employee])
从控制器调用时,它会更新除地址之外的所有内容。但是,如果我raise params.inspect
将其复制到脚本/控制台中的变量中,它确实可以工作。例子:
>> 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">
所以你可以看到地址是从脚本/控制台更新的,但不是从我的控制器更新的。
如果这是信息过载,那么这个问题的简单版本是:
为什么我的地址没有更新?