2010-12-11 3 views
52

Что такое рельсы для реализации проверки max max в Rails 3?Как реализовать валидатор min/max в Rails 3?

У меня есть модель с атрибутами min_age и max_age.

Возраст может быть в диапазоне 0..100, но я хотел бы также проверить значения пересечения, я имею в виду, что Макс greather чем или равна мин

{:min_age => 0, :max_age => 0} => true 
{:min_age => 0, :max_age => 1} => true 
{:min_age => 1, :max_age => 0} => false # max < min 
{:min_age => 1, :max_age => 101} => false # out of 0..100 range 

ответ

97

Отъезд ActiveModel :: Validations :: NumericalityValidator: RailsAPI NumericalityValidator

спецификации:

it { 
    subject.max_age = 10 
    subject.min_age = 20 
    subject.should be_invalid 
    subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}") 
} 

код:

validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age } 

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

Я не знаю, хотите ли вы проверить наличие или нет, но вы просто добавили бы это как еще один ключ к вашим проверкам, например.

validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true 
+0

ок, спасибо за этот пример !! – Robert

+0

Примечание. Это отлично работало при создании, но при «обновлении» я получил ошибку «уровень стека слишком глубокий» - используя действительные входные данные - это было зверь, который можно было найти. Нельзя сказать, что этот валидатор был причиной, потому что ошибка не обращается к строке кода до цикла. – JosephK

27

Вы также можете использовать inclusion...in, как в:

validates :height, :inclusion => { :in => 1..3000, :message => "The height must be between 1 and 3000" } 
9
validates_numericality_of :min_age, greater_than: 0 
validates_numericality_of :max_age, less_than_or_equal_to: 100 
validates_numericality_of :max_age, greater_than: :min_age 

Вы также можете использовать возраст, как это:

validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0 
+0

min_age 30, max_age 10, все равно получит корыто, но он не должен - моя третья строка кода в вопросе. – astropanic

+0

Я предложил вам использовать один возрастный вход, а не min и max. Один из способов решения - обеспечить максимальный размер max_age, чем min_age. См. Мое редактирование. Я не тестировал код. В любом случае вам нужно иметь некоторый код, чтобы гарантировать, что минимальный возраст не превышает максимальный возраст. – EastsideDeveloper

+0

Я не могу использовать один атрибут, потому что это не возраст, а возрастный диапазон. Я знаю, что мне нужен какой-то код для обеспечения пересечения значений, это был мой вопрос. – astropanic

Смежные вопросы