【问题标题】:How to initialize custom ActiveModel Validators in Rails 3+ app from within a Rails Engine如何在 Rails 引擎中初始化 Rails 3+ 应用程序中的自定义 ActiveModel 验证器
【发布时间】:2011-11-30 00:42:39
【问题描述】:

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

【问题讨论】:

  • 这给出的错误是什么?我认为在初始化程序中将它们定义为空类对您没有任何好处,因为它不会为验证器寻找“真实”代码。
  • 我收到 Unknown validator: 'NullityValidator' 因为在模型使用它们之前没有加载验证器。我实际上并没有在我的代码中将它们定义为空类。为了简洁起见,我想简要介绍一下我是如何尝试定义类的。整个验证器定义在顶部。
  • 可能是您在任何地方都不需要该文件吗?
  • 不需要我试图定义这些的 lib/ab_gem/engine.rb 文件,其他一切正常。我以为我可以用我拥有的其他初始化程序在那里初始化这些验证器,但它只是不起作用。我也尝试将它们移动到他们自己的文件并要求它,但我也没有任何运气。我认为关键可能是在初始化链中找到合适的位置来挂钩,但我不确定那会是什么。

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


【解决方案1】:

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

【讨论】:

  • 您还可以创建这些初始化程序并让它们从诸如your_engine/validators 的目录中加载文件。这样做的原因是我不希望验证器出现在初始化器中。这是库代码,所以它应该放在lib
  • 在 Rails 4 中也能很好地工作!
【解决方案2】:

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

【讨论】:

  • 不要在答案中提问,否则你永远不会有答案:)
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多