2016-05-20 6 views
2

私はモデルがあります:RAILS:既存のレコードを持つ新しい方法でネストされた属性

:私はエラーを取得し、既存メーカーとの新しいフレームを作成しようとすると

Frame.rb

belongs_to :manufacturer, foreign_key: 'model' 
accepts_nested_attributes_for :manufacturer, :reject_if => proc { |obj| obj.blank? } 

Frame.new({name: 'Name of the frame', manufacturer_attributes: {id:2}}) 

エラー:

Couldn't find Manufacturer with ID=2 for Frame with ID= 
+0

idが2の製造元は存在しますか? – dane

+0

@dane、あります – Src

+0

コメントアウトしてください:reject_if => proc {| obj | obj.blank? } – dane

答えて

2

問題はFrame.newはActiveRecordのパラメータmanufacturers_attributesに達したときに、それが保存されていないで、従ってルックアップを実行するとは、IDを持たないFrame.new協会manufacturers_attributesにルックアップを実行し、新たなレコードであることです。

私は既存のmanufacturerレコードから始まり、manufacturer.frames.create(frame_params)のようなフレームを作成することをお勧めします(一対多の関係を前提とします)。あなたは、このようにそれを行う必要がある場合

しかし、あなたはそうのようなmanufacturer_attributesメソッドを上書きすることができます

accepts_nested_attributes_for :manufacturer 
    def manufacturer_attributes=(attributes) 
    if attributes['id'].present? 
     self.manufacturer = Manufacturer.find(attributes['id']) 
    end 
    super 
    end 

したがって、あなたは、新しいレコードでそれをどの以前にアクセスするには、元のmanufacturer_attributesしようとする前にメーカーを割り当てますエラーが発生しました。

+0

複数のメーカー属性が存在し、 – map7

2

既存の製造元で新しいフレームを作成する場合は、それをパラメータに割り当て、ネストされた属性を使用して割り当てる必要があります。

Frame.new({name: 'Name', manufacturer_ids: [2], manufacturer_attributes: {id:2}}) 

新しいフレームが、今ではそれが正しくそれを見つけることができますmanufacturer_attributesとメーカーを更新しようとするので、割り当てられたメーカーがあります。

既存のメーカーのみを割り当て、属性を更新しない場合は、manufacturer_attributesは不要です。

関連する問題