2012-03-28 5 views
2

モデルVinに属するEntreeモデルがあります。モデル自体はモデルProducteurに属しています。モデル作成時に子モデルを初期化する

Entree作成/編集のフォームでは、親VinおよびProducteurの属性を作成するか、存在する場合に検索する(ユーザー入力に基づいた検索)ための属性をユーザーが定義できるようにします。

@entree = Entree.new 
@entree.vin = Vin.new  
@entree.vin.producteur = Producteur.new 

と形でfields_forヘルパーを使用し、それが動作します:今、私はアントレneweditアクションで次の手順を実行するために

。しかし、私はもっと多くのモデルとの依存関係を深めたいので、私はそれをDRYにしておきたいと思います。

class Vin < ActiveRecord::Base 
    after_initialize :vin_setup 

    def vin_setup 
    producteur = Producteur.new 
    end 
end 

コントローラからproducteur.newを削除する:私はproducteurの初期化を行いVinのモデルでafter_initializeコールバックを定義しました。

未定義のメソッドNilClassため `MODEL_NAME」:しかし、新しいアクションのエラーを取得し、私はそれが意味を推測

<%= fields_for @entree.vin.producteur do |producteur| %> 

を言う形でのラインのためのクラス

after_initializeコールバックは期待通りに動作しません。私は行方不明のものがありますか?また、コールバックを定義するのではなく、Vinモデルでafter_initializeメソッドを定義すると、同じエラーが発生します。

答えて

1

は、あなたはおそらく、あなたがproducteurという名前のローカル変数を初期化している、

def vin_setup 
    self.producteur = Producteur.new 
end 

あなたがそれを持っている方法が必要です。

+0

おかげで、それをしないこと。私はproducteurは定義された協会だと思った、それはそれを認識することができた。 – Antoine

0

after_initializeイベントにコールバックメソッドを登録することはできません。 after_initializeというメソッドを実装する必要があります。

これを試してみてください:

class Vin < ActiveRecord::Base 
    def after_initialize 
    self.producteur = Producteur.new if new_record? 
    end 
end 
関連する問題