2012-04-24 122 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" }