我需要验证信用卡号码.
model Billing validates :card, credit_card_number: true, allow_nil: true
验证宝石代码:
def validate_each(record, attribute, value) record.errors.add(attribute, options[:message] || :invalid) unless credit_card_valid?(value, extract_brands(record, options)) end
它工作正常.但后来我尝试用这种方式覆盖geter:
def card "****#{self[:card][-4,4]}" if self[:card] end
验证失败.当我猴子修补validates_each像那样:
def validate_each(record, attribute, value) value = record[attribute] record.errors.add(attribute, options[:message] || :invalid) unless credit_card_valid?(value, extract_brands(record, options)) end
它恢复运作良好.验证getter而不是持久化值是否是正确的验证行为(validates_each第一个变体是遵循指南).或者什么是解决我的问题的优先方式?更新:Activemodel/Activerecord版本:4.2.3