在new / build上删除了外键

时间:2011-01-29 02:40:57

标签: 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

但是,保存时,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

1 个答案:

答案 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])