2

これは簡単なことのように思えますが、数字を要求し、それが所定の量より大きくも小さくもないことを確認したいと思います。

validates :age_min, presence: true, numericality: {
  greater_than: 0, less_than_or_equal_to: :age_max
}

このテストは期待どおりに機能します

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

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

私は得るArgumentError: comparison of Float with nil failed

Railsがnil値を考慮に入れていないのは奇妙に思えますか、それとも何かが足りませんか?カスタムバリデーターを作成しなくてもこれを機能させることができるはずですが、おそらく私は間違っています。

4

1 に答える 1

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? }
于 2012-11-29T22:07:40.400 に答える