2009-10-28 3 views
0

3 개의 text_fields 그룹이있는 양식이 있습니다. 계산을하기 위해 채워진 두 개가 필요합니다. quantity은 항상 입력해야합니다. price이 비어 있으면 cost을 채워야하며 반대의 경우도 마찬가지입니다.다른 입력에 입력 된 내용을 기반으로 입력 유효성 검사 - 레일

시도해 보았지만 price은 아무 것도 입력하지 않아도됩니다. 나는 또한 :price == nil:price.blank?을 시도했지만 똑같은 일을합니다.

# app/models/item.rb 

validates_numericality_of :cost, :greater_than => 0 

if :price.nil? 
    validates_numericality_of :quantity, :greater_than => 0 
else 
    validates_numericality_of :price, :greater_than => 0 
end 

답변

2

문제의 코드는 인스턴스 변수를 기반으로 클래스 메서드를 정의하려고합니다. 이 방법이 효과가 없습니다. 또한 : 가격은 단지 상징 일뿐입니다. 내부 가치를 뛰어 넘는 어떠한 가치도 가질 수 없습니다. 구문 오류에서 다음과 같은 결과 : ':'

:price = nil 
:price = anything 

기호는 항상 후 텍스트 문자열을 설정하는 내부 값을 정의해야한다. 의미가 :price.nil?:price == nil은 사실이 아닙니다. 가격이 다른 클래스 메소드에 전달됨에 따라 혼란스러워집니다. 실제로 일어나고있는 것은 이러한 메소드가 심볼을 가져 와서 호출 할 인스턴스 메소드 이름, 실행시 열 이름 또는 해시에서 키로 동적으로 사용한다는 것입니다.

왜 당신이하고 있던 일이 효과가 없는지에 대해서는 충분합니다. 문제를 해결하는 방법에 대해 이야기 해 봅시다.

validations에 if 및 unless 절을 사용하려고합니다. 이 코드는 원하는 것을 정확하게 수행합니다.

# app/models/item.rb 
validates_numericality_of :cost, :greater_than => 0 

    validates_numericality_of :quantity, :greater_than => 0, 
    :if => Proc.new {|item| item.price.nil?} 
    validates_numericality_of :price, :greater_than => 0, 
    :unless => Proc.new {|item| item.price.nil?} 
end 
+0

이렇게하면'| item |'에서 오류가 발생합니다. – Ryan

+0

죄송합니다. 블록 앞에 Proc.new가 있어야합니다. 이제 해결되었습니다. – EmFi

+0

고마워, 그거 훌륭해. – Ryan

관련 문제