我有以下课程:
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')
)并使它对该值起作用。
我该怎么做?
答案 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
的身份访问它