Как инициализировать пользовательские валидаторы ActiveModel в приложении Rails 3+ из Rails Engine - PullRequest
3 голосов
/ 30 ноября 2011

Я пытаюсь загрузить некоторые пользовательские валидаторы из Rails Engine, но мое приложение продолжает отказывать из-за того, что валидатор не распознается.

Как правильно и в какое время инициализировать валидаторы в двигателе?

Например, у меня есть:

    class NullityValidator < ActiveModel::EachValidator
      # Validates whether <tt>value</tt> is <tt>nil?</tt>.
      def validate_each(record, attribute, value)
        record.errors.add(attribute, :not_nil) unless value.nil?
      end
    end

Из моего класса двигателей Engine < Rails::Engine Я пробовал несколько разных способов инициализации пользовательских валидаторов, таких как:

config.before_initialize do
  class NullityValidator < ActiveModel::EachValidator
  end
end

config.after_initialize do
  class NullityValidator < ActiveModel::EachValidator
  end
end

initializer 'ab_gem.validators' do |app|
  ActiveSupport.on_load :active_model do
    class NullityValidator < ActiveModel::EachValidator
    end
  end
end

initializer 'ab_gem.validators' do |app|
  ActiveSupport.on_load :active_record do
    class NullityValidator < ActiveModel::EachValidator
    end
  end
end

initializer 'ab_gem.validators' do |app|
  class NullityValidator < ActiveModel::EachValidator
  end
end

Я также пытался переместить их в пользовательский модуль для загрузки, но ни один из этих методов не инициализируется / загружается правильно.

Каждый раз, когда загружается модель моего приложения, я получаю Unknown validator: 'NullityValidator'

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Решение оказалось невероятно более простым и элегантным, чем я думал ... Просто создайте папку config/initializers/ для ваших инициализаторов и поместите туда валидаторы для загрузки в правильном порядке.

Итак, только что сделал:

config/initializers/validators.rb

Оставьте свой валидатор:

class NullityValidator < ActiveModel::EachValidator
  # Validates whether <tt>value</tt> is <tt>nil?</tt>.
  def validate_each(record, attribute, value)
    record.errors.add(attribute, :not_nil) unless value.nil?
  end
end

Тогда тебе пора. У меня сложилось впечатление, что определение инициализатора в вашем engine.rb сделает то же самое, но, видимо, нет. В любом случае, на мой взгляд, это намного чище и лучше.

0 голосов
/ 24 апреля 2012

Я работаю над проектом, в котором есть email_validator , который ранее работал, пока мы не переместили его на смонтированный двигатель.Теперь говорится, что email_validator не может быть найден.Должен ли я просто скопировать класс валидатора электронной почты и поместить его в config / initializers / validators.rb или есть лучший метод

...