2011-07-11 6 views
5

次のモデルセットアップがあります。私はこのような何か使用して作成しBefore_create not working

class Bracket < ActiveRecord::Base 
    before_create :set_round_to_one 

    def set_round_to_one 
    @round = 1 
    end 
end 

::私はログに伝えることができるか、変数がnullとしてDBに保存されているからではなく、

bracket = Bracket.new(:name => 'Winners', :tournament_id => self.id) 
bracket.save 

を私が想定して作成し使用しました新しく保存しても、うまくいきませんでした。 roundがあなたのbracketsテーブル内のフィールドで、あなたがセッターを呼び出す必要があることと仮定

答えて

11

self.round = 1

roundが実際にbracketattributesハッシュへとセッターを呼び出すことによってキーですのでですそのハッシュの値は正しく設定されています。

さらに、@round = 1を使用すると、最初に呼び出されたときに新しいインスタンス変数roundが作成されます。そして、ActiveRecordはインスタンス変数(attributesハッシュに見える)の値を探しませんので、@roundの値を保存する限り何も起こりません。

+0

私は 'round = 1'をやっていて、同じ問題がありました。 'round = 1'の前に' self.'を先行させると(例えば 'self.round = 1')私の問題を解決しました。ありがとう。 – Jeff

5

それはZabbaとvincehのソリューションどちらが正しいですが、代わりに、前に作成するの

class Bracket < ActiveRecord::Base 
    before_create :set_round_to_one 

    def set_round_to_one 
     self.round = 1 
    end 
end 
5

する必要があり、私はあなたがBracketround属性については、データベース内のデフォルト値を設定することを示唆しています。

+0

私は同意します。このようにするのははるかに慣れています。 –