Rails3 не загружает мои валидаторы в lib

Я помещаю EmailValidator в lib/validators/email_validator, и это не работает (я добавляю root/lib в load_path)

вот код. Я поместил класс в модульные проверки в качестве имени родительской папки

class Validators::EmailValidator < ActiveModel::EachValidator
    def validate_each(object, attribute, value)
        unless value =~ /^([^@\s]+)@([a-z0-9]+\.)+[a-z]{2,}$/i
            object.errors[attribute] << (options[:message] || "is not formatted properly")
        end
    end
end

Я получаю ошибку Неизвестный валидатор: 'email'

Ответ 1

У вас есть два варианта:

  • Либо поставьте свой пользовательский валидатор под config/initializers.
  • Или добавьте lib/validators в путь автозагрузки в config/application.rb.

    config.autoload_paths << "#{config.root}/lib/validators"

Лично я бы пошел со вторым вариантом, так как lib/validators делает для хорошей инкапсуляции.

Ответ 2

Поскольку вы помещаете свой собственный валидатор в Validators:: в lib/validators, вам также нужно ссылаться на это пространство имен.

validates :email, presence: true, :'validators/email' => true

Ответ 3

UPDATE: вам нужно следующее:

module Validators
  class EmailValidator < ActiveModel::EachValidator
    def validate(object, attribute, value)
        unless value =~ /^([^@\s]+)@([a-z0-9]+\.)+[a-z]{2,}$/i
            object.errors[attribute] << (options[:message] || "is not formatted properly")
        end
    end
  end
end

class YourModel < ActiveRecord::Base
  include Validators

  validates :email, :presence => true, :email => true
end

В противном случае вам нужно поместить ваш класс проверки в пространство имен ActiveModel::Validations. Когда вы пропустите пробел класса, ActiveRecord не увидит его, если это пространство имен не является пространством имен, которое оно уже включило.