2011-01-29 121 views
0

希望有人可以幫助我理解爲什麼會發生這種情況。我設置了以下情況...外鍵刪除新/建

@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: 

基本上無效我的外鍵。同樣的事情,如果我使用構建。爲什麼這個實例不能保持外鍵?

UPDATE: 使事情變得更簡單,即使我只是在我看來輸出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

您可以發佈您全面控制代碼,不會保存,也許你的`Product`和`Image`模型的內容? – 2011-01-29 03:05:28

回答

0

我的理解是,你的產品的show視圖包含一個形式張貼到控制器images。當您在視圖中根據@product創建@new_image變量時,它將product_id正確分配給圖像。但是,當您發佈表單時,這並不會持續。

您有兩種選擇。最簡單的方法就是將<%= f.hidden_field :product_id %>項目添加到您的表單中,這樣product_id實際上會發布到Image#create。或者,你可以在你的create方法創建一個嵌套的資源,做一個<%= form_for [@product, @new_image] do |f| %>代替<%= form_for @new_image %>那你很可能使用的是現在,然後執行:

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