2011-01-29 15 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'モデルの内容は? –

+0

さて、あなたが投稿した最初の2つの行はどこにありますか? –

+0

私のプロダクトコントローラのshowメソッド – brewster

答えて

0

私はそれを理解する方法、お使いの製品のshowビューはに投稿するためのフォームが含まれていますコントローラーimagesビュー内で@productに基づいて@new_image変数を作成すると、画像にproduct_idが正しく割り当てられました。しかし、これはあなたのフォームを投稿しても保持されません。

2つのオプションがあります。最も簡単なのは、フォームに<%= f.hidden_field :product_id %>アイテムを追加するだけです。つまり、product_idが実際にImage#createに投稿されます。また、ネストされたリソースを作成し、代わりにあなたはおそらく今使用している<%= form_for @new_image %><%= form_for [@product, @new_image] do |f| %>を行い、その後、あなたのcreate方法で行うことができます:

@product = Product.find(params[:product_id]) 
@new_image = @product.images.new(params[:image]) 
関連する問題