.build无法分配尚不存在的外键

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

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

但是,当我创建新用户时,它不会自动构建具有“前”或“配置文件”位置的图片。 事实上,图片没有任何更新。 图片模型有

 attr_accessible :placement 

并在picture.rb

 belongs_to :user 

并在user.rb中

 has_many :pictures accepts_nested_attributes_for :pictures, allow_destroy: true 

为什么我的构建命令无声地失败?

UPDATE

使用.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_tohas_many以及accepts_nested_attributes_for

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

为什么这不起作用?

不确定这是否是您的问题,但您需要将:user_id添加到picture.rb中的attr_acessible行。 您想要读/写的任何属性都需要是attr_accessible,否则您将获得该批量分配错误。

它位于文档中:用户ID在保存后由数据库分配。 因此,您必须先保存用户,然后才能使用user_id。

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