Rails 3:“accepts_nested_attributes_for”如何工作?

时间:2010-12-19 22:34:26

标签: ruby-on-rails ruby-on-rails-3 nested-attributes

考虑以下关联:

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 个答案:

答案 0 :(得分:14)

我认为您正在尝试创建一个新的关联项目,而不是与现有项目相关联。

要创建新项目,您似乎可以使用它。 当你在shop_attributes中传递id时,它不起作用,因为它正在查找一个尚不存在的关联。

如果您尝试与现有项目关联,则应使用以下内容:

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

这会将当前产品的商店分配给ID为“shop_id”的商店。 (产品应该有'shop_id'列。)