带参数的自定义验证器

时间:2018-12-17 13:14:58

标签: ruby-on-rails validation

我有以下课程:

class PatientPaymentSpreadsheetRow < ApplicationSpreadsheetRow
  include ActiveModel::Validations
  validate :date_format

  def date_format
    unless value('Transaction').split('/').last.length == 4
      errors.add('Transaction', 'date format invalid')
    end
  end
end

此特定验证恰好对value('Transaction')起作用。我希望我的验证器具有足够的通用性,可以传递任何值(例如value('Date of birth'))并使它对该值起作用。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您可以编写自定义的“每个验证器”,如Guides中所述:

class DateFormatValidator < ActiveModel::EachValidator
  def validate_each(model, attribute, value)
    return if value.split('/').last.length == 4
    model.errors.add(attribute, 'date format invalid')
  end
end

并像这样使用它:

class MyCustomModel
  include ActiveModel::Validations
  attr_accessor :my_date_attr
  validates :my_date_attr, date_format: true
end

答案 1 :(得分:0)

但是大概您希望验证无条件运行,所以...

validate :date_format
DATES_TO_VALIDATE = ['Transaction', 'Date of birth', 'Other date']

def date_format
  DATES_TO_VALIDATE.each do |key|
    unless value(key).split('/').last.length == 4
      errors.add(key, 'date format invalid')
    end
  end
end

可以根据Marek Lipka的答案将其提取到each_validator,并为每个模型使用自定义常量DATES_TO_VALIDATE,然后在验证器中以model.class::DATES_TO_VALIDATE的身份访问它