【问题标题】:Unknown validator: 'BeforeValidator' when validating date in Rails未知验证器:在 Rails 中验证日期时出现“BeforeValidator”
【发布时间】:2012-04-24 19:29:34
【问题描述】:

我在 User.rb 模型中添加了一个验证器,以在创建设计用户之前验证给定的生日是否超过 18 岁。

这是我的验证。

# 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'

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord devise


    【解决方案1】:

    Unknown validator: 'BeforeValidator' 表示你高估了魔法:)

    试试这个:

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

    【讨论】:

    • 您不必定义自定义验证器 :) 请参阅 validates 文档或 my answer
    • @Andión,不,我不知道。我没有:) 自定义验证器是具有validate_each 方法的对象。所以你在阅读文档时分心了。而且您的代码完全错误。您正在尝试比较 Date 和 Fixnum (18)。
    • OOOps,是的,这是完全错误的,感谢您指出。当我说自定义验证(意思是你的答案)时,我误用了这个名字,就像我把生日和年龄混为一谈一样愚蠢:(我试图表达我不喜欢人们在不需要时进行 lambda 验证。但在这个案例 yoy 是完全正确的 :)
    • 所以,如您所见:没有灵丹妙药。您必须至少使用 lambdas,否则 18.years.ago 将在计算后保存并始终保持不变。很高兴您解决了您的误解!
    【解决方案2】:

    你也可以试试:

    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
    

    【讨论】:

      【解决方案3】:

      :before 不是 ActiveRecord 的实际默认 validator。当 validates 找到任何它不知道的验证器名称时,它会搜索一个带有其名称的自定义验证器(在本例中为 BeforeValidation)

      所有验证都是在自然存储实际对象之前进行的,您不必像指出的那样制作自己的验证器。 ActiveRecord 已经提供了一个::numericality

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        相关资源
        最近更新 更多