2017-05-09 51 views
1

我試圖建立一個AASM的流程圖。我有一個狀態機,每個狀態都有很多狀態和很多事件。很難從AASM狀態機定義中看到機器。要做到這一點,我想要三種方法如下,是否有一個AASM方法來獲得下一個狀態,如果一個事件被觸發而沒有在rails中實際觸發事件

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) 

是否有類似的東西可用?有另一種方法來實現我想要的嗎?

更新

基於@ puneet18答案,我的狀態圖將如下

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

我怎麼會產生這樣一個表的代碼塊,將任何國家機器正常工作,不管它有多複雜?

回答

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 
相關問題