0

日付の形式を検証するモデルの 1 つのカスタム検証を構築しています。日付がdd/mm/yyyy現在であるように、dd/mm/yyyy および dd-mm-yyyy で動作します。しかし、何人かの人々が ddmmyyyy に入ると、Rails がそれを食べ尽くして別のものを吐き出すことがわかりました。

だから私はカスタム検証を行いました

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 を読んでいますが、何も見えませんか?

4

1 に答える 1

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

この実装も機能します。

于 2013-09-05T10:10:18.537 に答える