2012-04-24 89 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 2012-04-25 00:41:27

+0

你不必定义一个自定义的验证器:)见'验证'文档或[我的答案](http://stackoverflow.com/a/10306906/186424) – 2012-04-25 14:15:41

+0

@Andión,不,我不知道。而我没有:)自定义验证器是具有'validate_each'方法的对象。所以在阅读文档时你分心了。而你的代码是完全错误的。你试图比较日期和Fixnum(18)。 – jdoe 2012-04-25 14:57:52

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已经提供了一个::numericality

validates :birthdate, :numericality => { :greater_than => 18 , :message => "must be at least %{count} years old" }