3

我正在尝试从 Rails 引擎加载一些自定义验证器,但由于无法识别验证器,我的应用程序一直失败。

在引擎中初始化验证器的正确方法和时间是什么?

例如我有:

    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'

4

2 回答 2

4

该解决方案比我想象的要简单和优雅得多......只需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 railtie 中定义一个初始化程序会完成同样的事情,但显然不是。无论如何,在我看来,这是更清洁和更好的做法。

于 2011-12-01T19:47:28.290 回答
-2

我正在开发一个具有email_validator的项目,该项目以前一直在工作,直到我们将其移至已安装的引擎。现在它说找不到 email_validator。我应该只复制电子邮件验证器类并将其放入config/initializers/validators.rb还是有更好的方法

于 2012-04-24T15:28:23.603 回答