2015-12-17 3 views
4

Мне нужно подтвердить номер кредитной карты.Проверка доступа к валидации ActiveRecord

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 

Он вернулся, чтобы работать хорошо. Правильное ли поведение проверки, чтобы проверять геттеры вместо постоянных значений (validates_each первый вариант следует руководству). Или какой способ решить мою проблему? Обновление: Activemodel/Activerecord версия: 4.2.3

+0

Вы пытались определить свою собственную проверку? Определение чего-то типа класс CustomCreditCardValidator

+0

Зачем вам удивляться, что '**************** 1234' недействителен номер кредитной карты? – mudasobwa

ответ

1

Во-первых, метод, который вы определили, не относится к модели - это проблема, и как таковая должна быть перенесена на помощника или ведущего. Это, однако, очень распространенная практика иметь такие методы в модели, поэтому я бы не сказал, что это огромная проблема.

Вы можете легко обойти всю проблему, выбирая другое название для метода:

def starred_card 
    card && "****#{card[-4,4]}" 
end 
0

Если переопределить метод получения (как вы сделали здесь), вы должны написать пользовательскую проверку метод.

Например, это простая проверка, которая позволяет nil и гарантирует, что номер карты представляет собой строку из 16 цифр.

validate :correct_credit_card_number 

def correct_credit_card_number 
    if self[:card] && self[:card] !~ /^\d{16}$/ 
     errors.add(:card, "is not in the right format") 
    end 
end 
Смежные вопросы