2017-05-09 5 views
1

AASM에 대한 흐름도를 작성하려고합니다. 상태가 많은 상태 시스템과 각 상태에 대해 많은 이벤트가 있습니다. AASM 상태 시스템 정의에서 기계를 시각화하는 것은 어렵습니다. 이렇게하려면 다음과 같은 세 가지 방법이 필요합니다.실제로 레일에서 이벤트를 실행하지 않고 이벤트가 시작된 경우 다음 상태를 얻는 AASM 방법이 있습니까

1) 모든 상태를 반환하는 메서드. 이는 이미 AASM에 의해 제공됩니다. 즉, aasm.states.map(&:name)

2) 특정 상태에 대한 모든 이벤트를 반환하는 방법. AASM은 이미 현재 상태 (즉, aasm.events.map(&:name))의 모든 이벤트를 반환하는 메소드를 제공합니다. 이것은 내가 원하는 것이지만 상태를 메서드에 전달하고 싶습니다. 현재 상태를 사용하기보다는 상태를 사용하고 싶습니다.

3) 상태와 이벤트를 제외한 메소드. 메소드는 실제로 상태 머신에서 아무 것도 변경하지 않고 호출 될 때 다음 상태를 리턴해야합니다. 이와 비슷한 것,

next_1_1 = next_state(state1, event1) 
next_1_2 = next_state(state1, event2) 
next_1_3 = next_state(state1, event3) 
next_2_4 = next_state(state2, event4) 
next_2_5 = next_state(state2, event5) 
next_2_6 = next_state(state2, event6) 

이와 비슷한 것이 있습니까? 내가 원하는 것을 구현할 다른 방법이 있습니까?

State   Event  next state 
---------------------------------------- 
:not_started :start  :in_progress 
:in_progress :finish  :finished 
       :reassign :reassigned 
:finished  :reassign :reassigned 

어떻게 내가 어떤 상태 기계에 대한 작동 코드 블록으로이 같은 테이블을 생성 할 다음과 같이 @ puneet18 답변에 따라

업데이트

, 내 상태 다이어그램은 것 얼마나 복잡합니까? 코드 아래

답변

0

시도 :

캠페인 컨트롤러

aasm do # default column: aasm_state 
    state :not_started, :initial => true 
    state :in_progress 
    state :reassigned 
    state :finished 

    event :start do 
     transitions :from => :not_started, :to => :in_progress 
    end 

    event :finish do 
     transitions :from => :in_progress, :to => :finished 
    end 

    event :reassign do 
     transitions :from => [:in_progress, :finished], :to => :reassigned 
    end 
    end 

c = Campaign.first #stage = not_started 
c.start #stage = in_progress 
c.finish #stage = finished