1

我有以下代码用于在我的用户控制器中为用户创建图片:

  def new
    @user = User.new
    @pictures = @user.pictures.build({:placement => "front"},{:placement => "profile"})
  end

但是,当我创建一个新用户时,它不会自动构建带有“正面”或“个人资料”位置的图片。实际上,图片没有任何更新。图片模型有

attr_accessible :placement

并在图片.rb

belongs_to :user

并在 user.rb

has_many :pictures
accepts_nested_attributes_for :pictures, allow_destroy: true

为什么我的构建命令静默失败?

更新

使用 .save!,我了解到@pictures正在分配,但问题是没有 user_id 与它们关联。当我故意分配 user_id 时,如:

def new
    @user = User.new
    @pictures = @user.pictures.build({:placement => "front", :user_id => @user.id},{:placement => "profile", :user_id => @user.id})
 end

它仍然没有分配 user_id。

奇怪的是,当我在 rails 控制台中运行相同的命令时,它确实正确分配了 user_id。

似乎新的@user 直到@pictures 命令运行后才获得分配给他的自动ID,但控制台版本成功,因为它正在按顺序执行操作。

所以,这就是为什么我看到一个空白的 id。

为什么会这样?这种同时的 id 分配难道不是模型应该用belongs_toand 和has_manyand来处理的accepts_nested_attributes_for吗?

如果在保存之后才创建将它们链接在一起的 ID,那么解决分配嵌套属性的适当方法是什么?

为什么这不起作用?

4

2 回答 2

1

不确定这是否是您的问题,但您需要将 :user_id 添加到 picture.rb 中的 attr_accessible 行。您要读取/写入的任何属性都必须是 attr_accessible ,否则您将收到大量分配错误。

于 2012-10-08T23:01:19.347 回答
0

它在文档中:用户 ID 在保存后由数据库分配。所以你必须先保存用户,然后才能使用 user_id。

如果您将 :user_id => @user.id 更改为 :user => @user 它应该可以工作,因为 Rails 能够以正确的顺序保存它们,它知道它尚未保存并需要更新这些关系。

于 2012-08-10T08:43:28.113 回答