2010-12-11 4 views
52

레일 3에서 최소 최대 유효성 검사기를 구현하는 레일 방법은 무엇입니까?Rails 3에서 최소/최대 유효성 검사기를 구현하는 방법은 무엇입니까?

나는 min_age 및 max_age 속성을 가진 모델을 가지고 있습니다.

나이 0..100의 범위에있을 수 있습니다,하지만 난 최대가 ActiveModel을

{: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

체크 아웃을 min보다 greather거나 같은 것을 의미, 교차 값을 확인하는 것이 원하는 :: 검증을 :: 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, 여전히 잔물결이 나올 것입니다. 그러나 질문에 제 3 행의 코드가 없어야합니다. – astropanic

+0

나는 min과 max보다 하나의 연령 입력을 사용할 것을 제안했다. 해결할 수있는 한 가지 방법은 min_age보다 큰 max_age를 적용하는 것입니다. 내 편집을 참조하십시오. 나는 코드를 테스트하지 않았다. 어쨌든 최소 연령이 최대 연령보다 크지 않도록 몇 가지 코드가 필요합니다. – EastsideDeveloper

+0

나이가 아닌 연령대이기 때문에 하나의 속성을 사용할 수 없습니다. 가치 협상을 위해 몇 가지 코드가 필요하다는 것을 알았습니다. 그것은 제 질문이었습니다. – astropanic

관련 문제