Rails自定义验证 - 模型层

时间:2013-09-05 09:49:20

标签: ruby-on-rails validation model

我正在为我们的一个模型构建自定义验证,以验证日期的格式。所以日期应该是dd/mm/yyyy目前它适用于dd / mm / yyyy和dd-mm-yyyy。但是我们发现有些人正在进入ddmmyyyy然后铁路吃了那个并吐出了其他东西。

所以我做了一个自定义验证

class DateFormatValidator < ActiveModel::Validator
  def validate(record)
    record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date)
  end
end

然后在我要验证transaction_date的模型中,我创建一个像这样的私有模型

def date_is_correct_format
  validates_with DateFormatValidator
end

然后拨打validate :date_is_correct_format

我以前做过这个,但是这次似乎没有用,并且根本没有提出异常。我甚至可以在私有方法中做到这一点。

def date_is_correct_format
  this_is_a_fake_method_that_should_blow_up
  validates_with DateFormatValidator
end

并运行验证并将所有内容传递完毕。我不知道我错过了什么?我已经阅读了Ruby on Rails API,但我什么都看不到?

1 个答案:

答案 0 :(得分:1)

我已尝试过您在上面发布的代码,但效果很好。

  class User < ActiveRecord::Base
    validate :date_is_correct_format

    def date_is_correct_format
      validates_with DateFormatValidator
    end
  end

  class DateFormatValidator < ActiveModel::Validator
    def validate(record)
      record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date)
    end
  end

然后我在控制台中尝试,输出是:

  [1] pry(main)> User.create!(:transaction_date=>'fdsf')
     (0.1ms)  begin transaction
     (0.1ms)  rollback transaction
  ActiveRecord::RecordInvalid: Validation failed: Transaction date Date must be in the following       format: mm/dd/yyyy
  from /Users/zuozuo/.rvm/gems/ruby-2.0.0-p247@rails4/gems/activerecord-    4.0.0/lib/active_record/validations.rb:57:in `save!'

那你使用什么版本的Rails?

或者您可以尝试:

  class User < ActiveRecord::Base
    validates_with ::DateFormatValidator
  end

这个工具也有效。