希望有人能帮助我理解为什么会这样。我设置了以下实例......
@product = Product.find(params[:id])
@new_image = @product.images.new
当我调试@new_image
时,它正确设置了外键。
--- !ruby/object:Image
attributes:
product_id: 1
但是,保存时,product_id
未设置。当我注意到那个调试信息时,就是这个......
changed_attributes:
product_id:
基本上将我的外键置零。如果我使用构建同样的事情。为什么那个实例没有保留外键?
更新
为了使事情更简单,即使我只是在我的视图中输出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
答案 0 :(得分:0)
我理解它的方式,您的产品的show
视图包含一个发布到images
控制器的表单。在视图中根据@new_image
创建@product
变量时,它会将product_id
正确分配给图像。但是,当您发布表单时,这不会持续存在。
您有两种选择。最简单的方法是只在表单中添加<%= f.hidden_field :product_id %>
项,这样product_id实际上会发布到Image#create
。或者,您可以创建一个嵌套资源并执行<%= form_for [@product, @new_image] do |f| %>
而不是您现在可能正在使用的<%= form_for @new_image %>
,然后在create
方法中执行:
@product = Product.find(params[:product_id])
@new_image = @product.images.new(params[:image])