2012-04-24 6 views
1

私はUser.rbモデル内に検証者を追加して、指定された生年月日が18歳以上であることを検証します。未知のバリデータ:Railsで日付を検証する際に 'BeforeValidator'

これは私が持っている検証です。

# user.rb 
validates :birthdate, :before => lambda { 18.years.ago }, :before_message => "must be at least 18 years old" 
ユーザーのスキーマ内

# User schema 
t.date  "birthdate" 

問題は、オブジェクトを保存しようとしたとき、私は次のエラーを取得していますということです。

ArgumentError in Devise::RegistrationsController#create 

Unknown validator: 'BeforeValidator' 

答えて

3

Unknown validator: 'BeforeValidator'あなたは魔法を過大評価してきた意味:)

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

validate do |user| 
    if user.birthdate > 18.years.ago 
    errors.add(:birthdate, "must be at least 18 years old") 
    end 
end 
+0

それはあなたの例に '18.years.ago.to_date'を追加することによって、働いていました。 – Martin

+0

カスタムバリデータを定義する必要はありません:) 'validates'のドキュメントや[私の答え](http://stackoverflow.com/a/10306906/186424) –

+0

@Andiónを参照してください。そして、私はしなかった:)カスタムバリデータは 'validate_each'メソッドを持つオブジェクトです。読書中に気を散らしてしまった。あなたのコードは完全に間違っています。あなたはDateとFixnum(18)を比較しようとしています。 – jdoe

0

また、試すことができます。

before_validation :validade_birth_date 

private 

def validade_birth_date 
    if (birthdate != nil) 
     errors.add(:birthdate, "must be at least 18 years old") unless (birthdate < DateTime.now) 
    end 
end 
0

:beforeは、実際のデフォルトではありませんvalidator ActiveRecordの検証者がわからないバリデーター名を検出すると、その名前(この場合はBeforeValidation)を持つカスタムバリデーターを検索します。

実際のオブジェクトが本来格納される前にすべての検証が行われます。あなた自身のバリデータを指摘するようにしてください。 ActiveRecordのは、すでに1を提供します::numericality

validates :birthdate, :numericality => { :greater_than => 18 , :message => "must be at least %{count} years old" } 
関連する問題