如何在Rails引擎中初始化Rails 3+应用程序中的自定义ActiveModel验证器

时间:2011-11-30 00:42:40

标签: ruby-on-rails ruby ruby-on-rails-3 rails-engines

我正在尝试从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'

2 个答案:

答案 0 :(得分: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

然后你的好去。我的印象是在你的引擎中定义一个初始化器.rb railtie会完成同样的事情,但显然不是。不过,我认为这是更清洁,更好的做法。

答案 1 :(得分:-2)

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