当空白/零时,Rails 3验证数值抛出参数错误

Gra*_*ett 2 validation ruby-on-rails ruby-on-rails-3

这看起来很简单,但我想要一个数字,并确保它不大于或小于预定数量:

validates :age_min, presence: true, numericality: {
  greater_than: 0, less_than_or_equal_to: :age_max
}
Run Code Online (Sandbox Code Playgroud)

此测试按预期工作

test 'user should not be valid with age min greater than age max' do
  user = FactoryGirl.build(:user, age_min: 30, age_max: 20)
  assert !user.valid?
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试测试时,age_min需要:

test 'user should not be valid without age_min' do
  user = FactoryGirl.build(:user, age_min: nil, age_max: 20)
  assert !user.valid?
end
Run Code Online (Sandbox Code Playgroud)

我明白了 ArgumentError: comparison of Float with nil failed

Rails没有考虑零值,或者我错过了什么,这似乎很奇怪?看来你应该能够在没有编写自定义验证器的情况下使用它,但也许我错了.

Joh*_*gle 7

由于age_min id的数值验证取决于age_max的值,而不是固定值,我认为你想要将你的验证分开并用procs来防止nil值

validates :age_min, :age_max, :presence => true
validates :age_min, :numericality => {greater_than: 0, less_than_or_equal_to: :age_max}, :unless => Proc.new {|user| user.age_min.nil? || user.age_max.nil? }
Run Code Online (Sandbox Code Playgroud)