【问题标题】:Rails custom Validations - model layerRails 自定义验证 - 模型层
【发布时间】:2013-09-05 09:49:20
【问题描述】:

我正在为我们的一个模型构建一个自定义验证,用于验证日期格式。所以日期应该是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,但我什么都看不到?

【问题讨论】:

    标签: ruby-on-rails validation model


    【解决方案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
    

    这个工具也可以。

    【讨论】:

    • 我正在运行 rails 3.2.12。我知道嘿,我认为它会起作用。我正在与 sidekiq 工作人员一起在独角兽服务器上运行它。但我每次尝试都会重新启动它们
    • validates_with ::DateFormatValidator 需要::
    • :: 不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多