2011-11-30 38 views
3

我试图从Rails引擎加载一些自定义验证器,但由于验证器未被识别,我的应用程序仍然失败。如何在Rails引擎中初始化Rails 3+应用中的自定义ActiveModel验证器

什么是正确的方式&时间来初始化引擎中的验证器?

比如我有:

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'

+0

这是什么错误?我不认为将它们定义为初始化程序中的空类会对你有所帮助,因为它不会去寻找验证程序的“真实”代码。 –

+0

我收到未知验证程序:'NullityValidator',因为验证程序未在使用它们的模型之前加载。我实际上并没有将它们定义为代码中的空类。我想提供简短的片段,说明我为了简洁而试图定义类。整个验证器定义在顶部。 – JDutil

+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会完成同样的事情,但显然不是。无论如何,这在我看来是更清洁和更好的做法。

+6

您也可以创建这些初始值设定项,并让它们从'your_engine/validators'目录加载文件。原因是我不会期望验证器在初始化器中。它是库代码,所以它应该放在'lib'中。 –

+0

在Rails 4中也很好地工作! – Ben

-2

我的工作有一个email_validator以前的工作,直到我们把它移动到安装的发动机项目。现在它说是找不到email_validator。我应该只复制电子邮件验证程序类,并将其放入config/initializers/validators.rb或者有更好的方法

+1

不要在答案中提问,否则你永远不会有答案:) – Geoffroy

相关问题