2011-06-22 16 views
0

私はコメント表す(かなり単純)モデル持っている:(そのフィールドが正しく設定されて)Rails:class_nameとの関係が正しく保存されませんか?

class Comment < ActiveRecord::Base 

    STATES = [:processing, :accepted, :declined] 

    belongs_to :note 
    belongs_to :author, :class_name => 'User' 

    validates_inclusion_of :state, :in => STATES 
    validates_presence_of :author 

    default_scope :order => 'created_at DESC' 

    def initialize(attributes={}) 
     super(attributes) 

     self.state ||= 'processing' 
    end 
end 

しかし、毎回私はコメントを保存し、作者の関係は常に(セーブに失敗しただけでなく、実際にコメントは正常に保存され、著者は除外されます...)。これは、著者フィールド(Comment.first.authornil)の検証のためにComment.first.valid?falseに戻るまで続きます。

私は、state-fieldのデフォルト値を間違った方法で処理している疑いがありますか?その場合は、代わりにデフォルト値を設定する必要がありますか?

事前にあなたの助けのためのTHX

+0

https://github.com/pluginaweek/state_machine – Luke

+0

これは新しいコメントの作成時または既存のコメントの更新時にのみ起こりますか? – Luke

+0

既存のコメントを更新するときにも発生します – DeX3

答えて

4

状態属性については、代わりに初期化関数をオーバーライドのデフォルトを設定するafter_initializeコールバックを使用する方が良いでしょう:

def after_initialize 
self.state ||= 'processing' 
end 

適切に無効にするには関数を渡す必要があります:

def initialize(*args,&block) 
    super(*args,&block) 
    #what-you-want-to-execute 
end 

多くの場合、thを使用するよりも良い方法がありますです!

+0

k、thxそれを変更しました。私の問題は – DeX3

+0

で解決できませんでしたが、バリデーションを 'validates_presence_of:author_id'に変更してください。[doc](http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method- i-validates_presence_of) –

+0

カラムは実際には 'author'という名前なので、これは機能しません。 – DeX3

関連する問題