Ruby on rails 在新建/生成时删除外键

Ruby on rails 在新建/生成时删除外键,ruby-on-rails,foreign-keys,instance-variables,Ruby On Rails,Foreign Keys,Instance Variables,希望有人能帮助我理解为什么会发生这种情况。我设置了以下实例 @product = Product.find(params[:id]) @new_image = @product.images.new 当我调试@new_image时,它正确地设置了外键 --- !ruby/object:Image attributes: product_id: 1 但是,保存时,未设置产品\u id。就在那时,我注意到,在调试信息中,也是这样 changed_attri

希望有人能帮助我理解为什么会发生这种情况。我设置了以下实例

@product = Product.find(params[:id])
@new_image = @product.images.new
当我调试
@new_image
时,它正确地设置了外键

--- !ruby/object:Image 
        attributes: 
          product_id: 1
但是,保存时,未设置
产品\u id
。就在那时,我注意到,在调试信息中,也是这样

changed_attributes: 
  product_id: 
基本上是将外键置零。如果我使用build,也是一样的。为什么该实例没有保留外键

更新: 为了使事情更简单,即使我只是在视图中输出
debug Product.find(1).images.new
,我也会得到:

!ruby/object:ProductImage 
        attributes: 
          created_at: 
          product_id: 1
          updated_at: 
        attributes_cache: {}

        changed_attributes: 
          product_id: 
        destroyed: false
        marked_for_destruction: false
        new_record: true
        previously_changed: {}

        readonly: false

据我所知,您的产品的
show
视图包含一个表单,可将其发布到
图像
控制器。当您基于视图中的
@product
创建
@new\u image
变量时,它会将
@product\u id
正确分配给图像。但是,当您发布表单时,这种情况不会持续

你有两个选择。最简单的方法是只在表单中添加一个
项,这样产品id实际上会被发布到
图像#create
。或者,您可以创建一个嵌套资源并执行
而不是您现在可能正在使用的
,然后在
创建
方法中执行以下操作:

@product = Product.find(params[:product_id])
@new_image = @product.images.new(params[:image])

你能发布你完整的控制器代码来进行保存吗?也许还有你的
产品
图像
模型的内容?好的,那么你发布的前两行具体在哪里被调用?在我的产品控制器的show方法中,你的产品#show方法是否包含一个表单,然后发布到图像#create?是的,但是,我在
changed\u attributes
中看到空的产品标识,它还没有到达表单。我完全从等式中删除了控制器,如上次更新中所示。