0

Я пытался создать пользовательский класс проверки в Ruby on Rails, который можно развернуть. Однако я не могу заставить его использовать проверку как подкласса, так и суперкласса. Этого пример пояснит, что я пытаюсь достичь:Наследование с помощью пользовательских валидаторов Ruby on Rails

Супер-класс

class NameValidator < ActiveModel::EachValidator 
    def validate_each (record, attribute, value) 

     #Checks to see if the incoming string is free of any numerical characters 
     if value.match(/\A[+-]?\d+\Z/) 
     record.errors[attribute] << "String must contain no numerical characters" 
     end 
    end 
end 

подклассу

class SevenNameValidator < NameValidator 

    def validate_each (record, attribute, value) 

     # Checks and only allows 7 character strings to be validated 
     if value.length != 7 
      record.errors[attribute] << "String must be 7 characters exactly" 
     end 
    end 
end 

класса Модели

class User < ActiveRecord::Base 
    attr_accessible :firstname 

    validates :firstname, :seven_name => true 

end 

так, если строка " hello "проверяется результирующая ошибка =>" Строки должны быть 7 символов точно "

Однако, если строка «hello77» протестирована, она успешно проверена.

Не следует ли сначала проверять с NameValidator и видеть, что у него есть цифры? Если нет, как я могу получить наследование для работы в пользовательских валидаторах? Нужно ли использовать методы в моих классах валидатора? Пример будет оценен, я много искал, но я не могу найти пример для пользовательских валидаторов.

+2

Возможно, вы захотите использовать 'super' в validate_each' SevenNameValidator'. – oldergod

ответ

1

Вызов super в подклассе:

class SevenNameValidator < NameValidator 

    def validate_each (record, attribute, value) 

     # Checks and only allows 7 character strings to be validated 
     if value.length != 7 
      record.errors[attribute] << "String must be 7 characters exactly" 
     else 
      #call super to trigger super class method 
      super 
     end 
    end 
end 
1

Я думаю, что это могло бы проблема с регулярным выражением. Если вы пытаетесь сопоставить любую строку с цифрами, вы должны иметь что-то вроде /\A\D*\d+\D*\z/ прямо сейчас, вы соответствуете тонне вещей, которые я не думаю, что вы хотите.