我正在尝试从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'
答案 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 中,还是有更好的方法