我需要对模型进行验证,以便记录中的2个整数值(最小值和最大值)形成一个包含范围(例如2和3都可以,但4和1不是)。据我所知,因为我需要在相同的记录中验证对方的两个值,所以我必须使用ActiveModel :: Validator(而不是ActiveModel :: EachValidator)。所以,我尝试以下方法:Rails 3自定义验证器问题
模型(应用程序/模型/ position.rb):
class Position < ActiveRecord::Base
validates_with InclusiveRangeValidator
end
验证(应用程序/ lib目录/验证/ inclusive_range_validator.rb):
class InclusiveRangeValidator < ActiveModel::Validator
def validate(record)
record.errors[:base] << "#{record.minimum} and #{record.maximum} do not form a valid inclusive range." unless record.minimum < record.maximum
end
end
我已经读过Rails 3.0.5不会自动加载lib目录了,所以我在config/application.rb中添加了这行:
config.autoload_path += %W({config.root}/lib)
然后我重置导轨服务器,以便将配置/ application.rb更改。我运行我的单元测试,试图运行模型来证明这个验证有效。我得到这个错误:
uninitialized constant: Position::InclusiveRangeValidator (NameError)
我认为正在发生的是,Rails的是不承认/找到我的自定义验证器类,所以它假定InclusiveRangeValidator是在类的常数,它的中引用但是,我想。我对config/application.rb所做的更改会将我的验证器置于加载路径中,以便它可用。
我已经通过了StackOverflow上的其他文章,并没有提出解决方案,并且我已经阅读了关于验证器的API文档,但都无济于事。我必须做一些简单而愚蠢的事情,但我看不出问题所在。任何帮助?
编辑: 更多的搜索后,我发现,我并不需要一个定制的验证所有的,因为我可以完成这个相同的目标:
validates :minimum, :numericality => {:greater_than_or_equal_to => 0 }
validates :maximum, :numericality => {:greater_than => :minimum }
然而,问题仍然存在至于为什么Rails无法找到自定义验证类。
应该是带“s”的“路径” - config.autoload_paths + =%W [#{config.root}/lib/validators /] – 2011-06-24 22:09:30