Rails 3自定义验证器问题

时间:2011-04-08 15:31:04

标签: ruby-on-rails-3 validation configuration

我需要对模型应用验证,以便记录中的2个整数值(最小值和最大值)形成包含范围(例如2和3都可以,但4和1不是)。根据我的理解,因为我需要在同一记录中相互验证2个值,所以我必须使用ActiveModel :: Validator(而不是ActiveModel :: EachValidator)。所以,我尝试以下方法:

模型(app / models / position.rb):

class Position < ActiveRecord::Base
  validates_with InclusiveRangeValidator
end

Validator(app / lib / validators / 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)

然后我重置了rails服务器,因此它将更改为config / application.rb。我运行我的单元测试,它试图运用模型来证明这个验证是有效的。我收到这个错误:

uninitialized constant: Position::InclusiveRangeValidator (NameError)

我认为发生的事情是Rails没有识别/找到我的自定义验证器类,因此它假设InclusiveRangeValidator是它所引用的类中的常量。但是,我认为我对配置/应用程序所做的更改。 rb会将我的验证器放在加载路径中,以便它可用。

我已经浏览了StackOverflow上的其他帖子并没有提出解决方案,而且我已经阅读了验证器上的API文档,但无济于事。我必须做一些简单而愚蠢的事情,但我看不出是什么问题。有什么帮助吗?

修改: 经过更多的搜索,我发现我根本不需要自定义验证器,因为我可以用这个完成相同的目标:

validates :minimum, :numericality => {:greater_than_or_equal_to => 0 }
validates :maximum, :numericality => {:greater_than => :minimum }

然而,问题仍然是Rails无法找到自定义验证类的原因。

1 个答案:

答案 0 :(得分:2)

有一次,我将application.rb中的行更改为:

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

Rails能够找到加载我的自定义验证器的正确路径。我犯了错误,假设Rails会自动递归目录结构,显然情况并非如此。