web-dev-qa-db-ja.com

Rails 3:「accepts_nested_attributes_for」はどのように機能しますか?

次の関連付けを検討してください。

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

「My Shop」という名前の新しいショップが作成され、@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このショップが割り当てられるように?

34
Misha Moroshko

新しい関連アイテムを作成するのか、既存のアイテムに関連付けるのかを理解しようとしていると思います。

新しいアイテムを作成するために、機能しているようです。 shop_attributesでIDを渡したとき、まだ存在しない関連付けを検索しているため、機能しませんでした。

既存のアイテムに関連付けようとしている場合は、以下を使用する必要があります。

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

これにより、現在の製品のショップがID「shop_id」のショップに割り当てられます。 (商品には「shop_id」列が必要です。)

14
clemensp