【发布时间】: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 < 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