Пользовательский валидатор с аргументом - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть следующий класс:

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 голосов
/ 17 декабря 2018

Но, по-видимому, вы хотите, чтобы проверки выполнялись безоговорочно, поэтому ...

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

Это может быть извлечено до each_validator согласно ответу Марека Липки с пользовательской константой DATES_TO_VALIDATE для каждогомодель и доступ к нему в валидаторе как model.class::DATES_TO_VALIDATE

0 голосов
/ 17 декабря 2018

Вы можете написать собственный «каждый валидатор», как описано в Руководства :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...