Reputation: 533
I facing this problem in may Rails 3.0.3 App, I think this is a silly error but I can't figure out why it's happening, or in fact, I'm misunderstanding the ActiveRecord behavior and it's is not really a error.
This is the scenario, I've three models:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :addresses, :as => :addressable
accepts_nested_attributes_for :addresses
end
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
belongs_to :address_base
accepts_nested_attributes_for :address_base
end
class AddressBase < ActiveRecord::Base
has_many :address
end
If I try to instantiate a new User passing a hash parameters, by this way:
User.new({"addresses_attributes"=>
{"0"=>
{"number"=>"10",
"complement"=>"Next Starbucks",
"address_base_attributes"=>
{"city"=>"San Francisco",
"zip_code"=>"00010",
"district"=>"San Francisco",
"id"=>"10",
"street"=>"Market St.",
"state"=>"CA"}
}
},
"name"=>"Homer Simpson",
"password_confirmation"=>"[FILTERED]",
"document"=>"123321111",
"password"=>"[FILTERED]",
"email"=>"[email protected]"
})
I face the error
Couldn't find AddressBase with ID=10 for Address with ID=
And it happens because that AddressBase already exists and the Address don't, if I remove the AddressBase.id parameter of the hash everything works, but I not want it, because on this way, always will be created a new register for Address and AddressBase. My intention is reuse commons AddressBase's, so the scenario of a new Address with an existent AddressBase will be necessary.
Now this is my doubts, I'm missing some parameter in the AddressBase hash?? Something like saying that the record already exist? Or it's a problem with belongs_to and has_many associations of ActiveRecord?
Thanks in advance.
Upvotes: 2
Views: 755
Reputation: 1188
The problem is that you cannot mass assign the ID attribute in rails models (give the ID to the data hash you initialize the model with).
It's hard for me to reproduce you're situation but if you know the model exist it's easier to supply the id of address_base instead of a hash with all the data.
For example:
User.new({"addresses_attributes"=>
{"0"=>
{"number"=>"10",
"complement"=>"Next Starbucks",
"address_base_id" => 10}
},
"name"=>"Homer Simpson",
"password_confirmation"=>"[FILTERED]",
"document"=>"123321111",
"password"=>"[FILTERED]",
"email"=>"[email protected]"
})
Upvotes: 1