2012-04-18 5 views
5

approver_note, po_number 및 state_id가있는 송장 모델이 있습니다.레일 3 유효 범위 조건 유효성 확인

나는 검증 확인해야합니다

validates :approver_note, :presence => true, {:scope => state_id == 3} 
validates :po_number, :presence => true, {:scope => state_id ==2} 

따라서, 사용자가 3 = STATE_ID, 그는 메모를 입력해야합니다 선택합니다. state_id = 2를 선택하면 po_number를 입력해야합니다.

도움이 될 것입니다 ... 감사합니다!

답변

7

:scope 대신 :if 옵션을 찾고 있습니다.

validates :approver_note, :presence => true, 
    :if => lambda { |invoice| invoice.state_id == 3 } 

그러나 람다 조금 추한이기 때문에, 아마 당신이 더 조금 무슨 일을하는지 캡슐화하는 방법을 추가 할 것입니다 : 당신이 실제로 다른 속성의 무리가있는 경우

validates :approver_note, :presence => true, :if => :requires_note? 
validates :po_number, :presence => true, :if => requires_po_number? 

def requires_note? 
    state_id == 3 
end 

def requires_po_number? 
    state_id == 2 
end 

validates :approver_note, :presence => true, :if => :green_state? 
validates :po_number, :presence => true, :if => orange_state? 

def green_state? 
    state_id == 3 
end 

def orange_state? 
    state_id == 2 
end 

는 (함께 "녹색"교체 "high_documentation"또는 무엇 이건 - - 난 몰라 : state_id 3, 그냥 메모 때 요구되는, 당신은 이런 식으로 뭔가를 할 수 있습니다 .) 당신의 세계에

을 의미가 아니면이 상태가 무엇인지 결정하게하려면 :

def green_state? 
    state.green? 
end 

은 정말 당신의 실제에보다 밀접하게 코드를 부착합니다에서 용어를 만들기 위해 도움이 되나요 언어는 "3"과 "2"와 반대입니다.

+0

+1 훌륭한 세부 정보 및 옵션. –

+0

완벽한, 감사합니다! 나는 람다를 좋아하지 않기 때문에 두 번째 옵션을 사용했습니다. 그러나 올바른 유효성 검사 오류 메시지가 표시 되더라도 레코드는 계속 업데이트됩니다. 즉, 사용자가 po_number를 입력하지 않고 승인 (state_id = 2)을 선택하면 오류가 표시되지만 레코드는 여전히 invoice.state_id = 2 ...로 업데이트됩니다. –

+0

흠, 그건 아마도 컨트롤러에서 별개의 문제로 들립니다. 유효성 검사가 실패하면 ActiveRecord가 저장되지 않습니다. 다른 질문으로 게시하고 컨트롤러 작업을 포함 할 수 있습니다. –