avaz
avaz

Reputation: 533

"Couldn't find" Error ActiveRecord.new method

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

Answers (1)

Danny Hiemstra
Danny Hiemstra

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

Related Questions