Не удалось найти метод Ошибка ActiveRecord.new

Я столкнулся с этой проблемой в майском приложении Rails 3.0.3, я думаю, что это глупая ошибка, но я не могу понять, почему это происходит, или на самом деле я неправильно понимаю поведение ActiveRecord, и на самом деле это не ошибка.

Это сценарий, у меня есть три модели:


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

Если я попытаюсь создать экземпляр нового пользователя, передающего хэш-параметры, следующим образом:


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

Я сталкиваюсь с ошибкой

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

И это происходит потому, что AddressBase уже существует, а Address нет, если я удалю параметр AddressBase.id хэша, все работает, но я этого не хочу, потому что таким образом всегда будет создаваться новый регистр для Address и База адресов. Мое намерение состоит в том, чтобы повторно использовать общую базу адресов, поэтому потребуется сценарий нового адреса с существующей базой адресов.

Теперь это мои сомнения, мне не хватает какого-то параметра в хэше AddressBase ?? Что-то вроде того, что запись уже существует? Или это проблема с ассоциациями own_to и has_many ActiveRecord?

Заранее спасибо.


person avaz    schedule 22.02.2011    source источник


Ответы (1)


Проблема в том, что вы не можете массово назначать атрибут ID в моделях rails (укажите ID хэшу данных, которым вы инициализируете модель).

Мне трудно воспроизвести вашу ситуацию, но если вы знаете, что модель существует, проще предоставить идентификатор address_base вместо хэша со всеми данными.

Например:

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

})

person Danny Hiemstra    schedule 22.02.2011
comment
Спасибо @danny-hiemstra! Это то, что вы предлагаете, это то, что я действительно не мог видеть. Мне просто нужно подумать, как я буду строить представления для решения этой ситуации, потому что у проблемы есть сценарии, один из которых — когда AddressBase уже существует, поэтому я просто передам address_base_id в хеше, второй сценарий — когда AddressBase не не существует, поэтому его нужно будет создать, и мне нужно будет передать все его значения в хеш, я попытаюсь выяснить, как это сделать. Спасибо большое. - person avaz; 22.02.2011
comment
Кроме того, вы можете сначала проверить, существует ли он, удалить ли ключ из хэша params, например, с помощью метода Hash.delete, а затем добавить новое значение в хэш с помощью address_base_id. - person Danny Hiemstra; 22.02.2011
comment
Я проверяю свой контроллер, я больше не передаю «id» в хеше, а в контроллере я проверяю, существует ли уже AddressBase с данным zip_code в базе данных, если это правда, я просто устанавливаю ссылку напрямую user.addresses.first.address_base = address_base_from_database (это всего лишь фрагмент), если false, я просто сохраняю пользователя и создаются адрес и адресная_база. Но я хочу решить это прямо в представлении. Почему рельсы, когда хэш имеет id AddressBase, он пытается найти регистр адреса, это обычное поведение для принадлежности_к? - person avaz; 23.02.2011