2011-02-10 8 views
1

私のレールアプリで私はUserモデルを持っています。私はいくつかのカスタム検証を持っているし、前に今最初に実行されるのは何ですか?

Class User < AvtiveRecord::Base 
    before_save :save_user 
    validate :validate_user 

    def save_user 
    self.guest = true if(!self.admin? && !self.guest) 
    end 

    def validate_user 
    errors.add(:age, "can't be less than 20") if self.age < 20 
    end 
end 

以下のようにブロックを保存しているモデルでは

は、私はちょうどかどうかを検証するブロックが第1または検証を実行することを知りたいと思いました。ユーザーの役割に基づいて他の検証が行われるためです。したがって、validateブロックが最初に実行され、検証エラーがなく、before saveが値を実行および変更する場合。これらの値は再び検証されますか?

ありがとうございました。

答えて

2

before_saveコールバックの前に検証が呼び出されます。検証の前に実行する場合は、次のようにbefore_validation_on_createまたはbefore_validation_on_updateを使用できます。

class User < ActiveRecord::Base 
    before_validation_on_create :save_user 
    validate :validate_user 

    def save_user 
    self.guest = true if(!self.admin? && !self.guest) 
    end 

    def validate_user 
    errors.add(:age, "can't be less than 20") if self.age < 20 
    end 
end 
0

これらの値は再度検証されません。バリデーションは保存と同じように1回発生します。そうしないと、値を変更したときにいつでもループ状態に陥る可能性があります。

関連する問題