2011-02-22 3 views
2

may may be Rails 3.0.3 App에서이 문제가 발생했습니다.이 기능은 어리석은 오류라고 생각되지만 실제로 발생하는 이유를 알 수 없습니다. ActiveRecord 동작을 오해하고 실제로 오류가 아닙니다."찾을 수 없습니다"오류 ActiveRecord.new 메서드


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]" 
}) 

내가 오류에 직면 :이 방법으로, 해시 매개 변수를 전달하는 새로운 사용자를 인스턴스화하려고하면


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 

:

내가 세 가지 모델을했습니다, 시나리오입니다

Couldn't find AddressBase with ID=10 for Address with ID=

주소록을 제거하면 AddressBase가 이미 존재하고 주소가 없기 때문에 발생합니다. 해시의 ase.id 매개 변수는 모두 작동하지만이 방법으로 항상 Address 및 AddressBase에 대한 새 레지스터가 만들어 지므로 필요하지 않습니다. 나의 의도는 AddressBase의 재사용이다. 따라서 기존의 AddressBase를 가진 새로운 Address의 시나리오가 필요할 것이다.

이제 이것이 내 의구심이며, AddressBase 해시에 매개 변수가 누락되었습니다. 그 레코드가 이미 존재한다고 말하는 것 같은가요? 또는 ActiveRecord의 belongs_to 및 has_many 연관에 문제가 있습니까?

미리 감사드립니다.

답변

1

문제는 레일스 모델에서 ID 속성을 대량 할당 할 수 없다는 것입니다 (ID를 모델을 초기화하는 데이터 해시에 제공).

상황을 재현하는 것이 어렵지만 모델이 존재한다는 것을 알고 있으면 모든 데이터가 포함 된 해시 대신 address_base의 ID를 제공하는 것이 더 쉽습니다. 예를 들어

:

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]" 

})

+0

감사 @ 대니-hiemstra! 내가 정말로 볼 수없는 것이 당신이 제안하는 것입니다. 이 문제가 시나리오를 가지고 있기 때문에 하나의 예제는 AddressBase가 이미 존재하므로 해시에 address_base_id를 전달할 것이므로 두 번째 시나리오는 AddressBase가 존재하지 않기 때문에 그는 만들어 져야 할 것이고, 나는 그가 해시 값을 모두 전달할 필요가있을 것이다. 나는 이것을 어떻게하는지 알아 내려고 노력할 것이다. 고맙습니다. – avaz

+0

또한 먼저 Hash.delete 메서드를 사용하여 params 해시에서 키를 제거한 다음 address_base_id를 사용하여 해시에 새 값을 추가하는 경우 먼저 해당 키가 있는지 확인해야합니다. –

+0

나는 내 컨트롤러에서 검사하고 있는데, 해시에서 'id'를 더 이상 전달하지 않고 컨트롤러에서 AddressBase가 데이터베이스에 주어진 zip_code와 함께 이미 존재하는지 확인합니다. 직접'user.addresses.first.address_base = address_base_from_database'를 참조하십시오 (단지 스 니펫 일뿐입니다). false 인 경우 사용자를 저장하면 주소와 address_base가 생성됩니다. 그러나 내가 바라는 것은 직접이 문제를 해결하는 것입니다. 왜 해시가 주소의 Register를 찾기 위해 AddressBase의 id를 가지고있을 때 이것이 레일스의 일반적인 동작입니까? – avaz

관련 문제