【问题标题】:.build can't assign foreign key that doesn't exist yet.build 无法分配尚不存在的外键
【发布时间】:2012-08-09 02:10:14
【问题描述】:

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

  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

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

更新

使用 .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 的原因。

为什么会这样?模型不应该使用belongs_tohas_manyaccepts_nested_attributes_for 来处理这种同时分配的id 吗?

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

为什么这不起作用?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 已将 @user.id 更改为 @user。同样的问题。
      • 另外,这给了我一个Can't mass-assign protected attributes: user 错误。
      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多