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

时间:2012-08-09 02:10:14

标签: ruby-on-rails ruby-on-rails-3 model-view-controller nested-attributes

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

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

但是,当我创建新用户时,它不会自动构建展示位置为“front”或“profile”的图片。事实上,图片没有任何更新。图片模型有

attr_accessible :placement

和picture.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。

在@pictures命令运行之后,新的@user似乎没有为他分配自动ID,但是控制台版本正在成功,因为它正在按顺序执行操作。

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

为什么会这样?并不是这个同时的I​​D赋值模型应该用belongs_tohas_many以及accepts_nested_attributes_for来处理?

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

为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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