Наследование с пользовательскими валидаторами 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

поэтому, если проверяется строка «привет», возникает ошибка => «Строки должны содержать ровно 7 символов»

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

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


person Jaiesh_bhai    schedule 24.06.2013    source источник
comment
Вы, вероятно, захотите использовать super в validate_each для SevenNameValidator.   -  person oldergod    schedule 24.06.2013


Ответы (2)


Вызов 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
person Bob    schedule 24.06.2013

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

person Tyler Morgan    schedule 24.06.2013