Rails3: validates_with, в какое место я должен поместить MyValidator? - PullRequest
2 голосов
/ 14 июля 2010

У меня есть валидатор EmailValidator и класс User:

class EmailValidator < ActiveModel::Validator
  def validate(record)
    record.errors[:base] << "error"  unless record.email.scan("@")
end

class User < ActiveRecord::Base
  validates_with EmailValidator
end

Если я помещаю определение EmailValidator в отдельный файл в каталоге lib / или в user.rb после определения класса User, я получаю сообщение об ошибке:

/usr/lib/ruby/gems/svn/gems/rspec-core-2.0.0.beta.16/lib/rspec/core/backward_compatibility.rb:20:in `const_missing': uninitialized constant User::EmailValidator (NameError)

Но если я добавлю определение EmailValidator перед определением пользователя в user.rb, как в примере выше, это нормально.

В каком месте я должен поставить EmailValidator?

Ответы [ 2 ]

4 голосов
/ 14 июля 2010

Вы должны иметь возможность просто поместить его в lib/email_validator.rb в последней версии Rails 3 HEAD и автоматически загрузить.

Вы используете более старую версию?

На короткое время(т. е. до тех пор, пока фиксация не была отменена), файлы в lib не были автоматически загружены - и я считаю, что это все еще является целью, но реализация была ошибочной, поэтому изменение было отменено на данный момент.Чтобы быть безопасным и полностью совместимым с прямой пересылкой, добавьте следующую строку в config/application.rb:

config.autoload_paths      += %W( #{config.root}/lib )

В качестве альтернативы, если код работает при использовании вашего приложения, но не при запуске RSpec, это может бытьошибка в RSpec, а не в Rails.

1 голос
/ 14 июля 2010

Я решил похожую проблему, поместив что-то вроде этого в

RAILS_APP/config/initializers/my_custom_file.rb

require 'mylibfile' # it will load file found in lib/mylibfile.rb

это решение позволяет загружать пользовательские библиотеки во время загрузки приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...