Rails 3: Как работает «acceptpts_nested_attributes_for»? - PullRequest
33 голосов
/ 20 декабря 2010

Рассмотрим следующую связь:

class Product < ActiveRecord::Base
  belongs_to :shop
  accepts_nested_attributes_for :shop
end

Если

params[:product][:shop_attributes] = {"name" => "My Shop"}

и я делаю:

@product = Product.new(params[:product])
@product.save

новый магазин с именем «Мой магазин» создан и назначен на @product, как и ожидалось.

Однако я не могу понять, что происходит, когда shop_attributes содержит некоторые id, например:

params[:product][:shop_attributes] = {"id" => "20", "name" => "My Shop"}

Я получаю следующую ошибку:

Couldn't find Shop with ID=20 for Product with ID=

Вопрос 1

Что это значит?

Вопрос 2

Если это так, то есть id магазина известен, и магазин с таким id уже существует, как мне создать @product таким образом, чтобы этот магазин был ему присвоен?

1 Ответ

14 голосов
/ 20 декабря 2010

Я думаю, что вы пытаетесь понять, как создать новый связанный элемент, а не ассоциировать с существующим элементом.

Для создания нового предмета, похоже, он работает. Когда вы передали идентификатор в shop_attributes, он не работал, потому что он ищет ассоциацию, которая еще не существует.

Если вы пытаетесь связать с существующим элементом, вы должны использовать следующее:

params[:product][:shop_id] = "20"

Это назначит магазин текущего товара магазину с идентификатором shop_id. (Товар должен иметь столбец shop_id.)

...