2013-10-17 1 views
4

state_machine gem을 사용하여 전환에서만 실행되는 유효성 검사를하고 싶습니다. 예를 들면 다음과 같습니다.state_machine 전환시 유효성 검사

# Configured elsewhere: 
# StateMachine::Callback.bind_to_object = true 

class Walrus > ActiveRecord::Base 
    state_machine :life_cycle, :initial => :fetus do 
    state :fetus 
    state :child 
    state :adult 
    state :dead 

    event :coming_of_age do 
     transition :child => :adult 
    end 


    before_transition :child => :adult do 
     validate :coming_of_age_party_in_the_future 
    end 
    end 
end 

성인용 상태에 첨부하면 해당 날짜가 지나면 실패합니다. 그러나 전환 과정에서 유효해야합니다. 다음과 같이 추가 할 수 있습니다.

validate :coming_of_age_party_in_the_future, if: 'adult? && life_cycle_was == "child"' 

그러나 전환점을 놓친 것 같습니다.

또한 콜백 객체에서 바인딩하고 있으므로 조건부로 'validate'라고하는 클래스 메소드를 어떻게 호출할까요? 콜백의 많은 메소드가 private이기 때문에 바인딩이 필요합니다.

답변

1

transition if: :x 기능을 사용 해본 적이 있습니까?

그것은이 같은 것을 작동합니다 :

event :coming_of_age do 
    transition :child => :adult, if: :coming_of_age_party_in_the_future 
end 

당신은 (상단) '예'또는 '구문의 유연성'에서 '전환 컨텍스트'(의 섹션 '클래스 정의를'꽤 멀리 아래로 볼 수 있습니다) README

+0

이러한 번호가 있으면 어떻게 될까요? 전이를 확인하려면 레일 유효성 검사기가 문제가되지 않습니까? 꽤 일반적인 사용 사례 인 것 같습니다. – Chris

+0

기술적으로는 그렇지 않습니다. case 문에 중첩 된 모든 유효성 검사를 유지하는 하나의 메서드를 만들거나 언급 한대로 할 수 있지만 전환 자체를 금지하거나 금지하려는 것으로 가정하므로 'guarding'논리를 전환 - 가독성을 위해서만 사용하는 경우. – CMW

+0

'그런 경우 전환을 확인하는 맞춤 메소드를 추가하는 것이 더 낫습니까? 'life_cycle_was == 'child'&& adult? '와 마찬가지로 – Chris

관련 문제