Я надеюсь, что это может помочь
6.1. Пользовательские валидаторы. Пользовательские валидаторы - это классы, расширяющие ActiveModel :: Validator.Эти классы должны реализовывать метод validate, который принимает запись в качестве аргумента и выполняет проверку для нее.Пользовательский валидатор вызывается с помощью метода validates_with.
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'X'
record.errors[:name] << 'Need a name starting with X please!'
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
Самый простой способ добавить пользовательские валидаторы для проверки отдельных атрибутов - это использовать ActiveModel :: EachValidator.В этом случае пользовательский класс валидатора должен реализовывать метод validate_each, который принимает три аргумента: запись, атрибут и значение, которые соответствуют экземпляру, проверяемый атрибут и значение атрибута в переданном экземпляре.
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
class Person < ActiveRecord::Base
validates :email, :presence => true, :email => true
end
Как показано в примере, вы также можете комбинировать стандартные валидации с вашими собственными валидаторами.
http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations