2011-04-08 127 views
0

我需要对模型进行验证,以便记录中的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无法找到自定义验证类。

回答

2

有一次,我改变了线application.rb中来:

config.autoload_paths += %W[#{config.root}/lib/validators/] 

Rails的是能够找到我的加载自定义验证正确的道路。我错误地认为Rails会自动递归目录结构,但显然不是这种情况。

+5

应该是带“s”的“路径” - config.autoload_paths + =%W [#{config.root}/lib/validators /] – 2011-06-24 22:09:30