2011-09-20 57 views
1

我有一個使用state_machine gem(https://github.com/pluginaweek/state_machine)來跟蹤模型狀態的Rails 3.1應用程序。和state_machine-audit_trail gem(https://github.com/wvanbergen/state_machine-audit_trail)保存狀態更改。使用state_machine&state_machine_audit_trail返回到之前保存的狀態

#State Machine states for Work Orders 
state_machine :initial => :created do 
after_transition :on=>:validate, :do=>:create_report 

store_audit_trail 
    event :validate do 
    transition :created => :validated 
    end 
    event :reject do 
    transition :created => :rejected 
    end 
end 

有一種獨特的狀態「拒絕」這是暫時的,我正在尋找一種方式來觸發一個事件到模型返回爲保存在WorkOrderStateTransition模型中的前一個狀態(通過審計提供寶石)。

我創建了一個方法'previous_state',它發現最後一個狀態轉換,並且當通過控制檯調用該方法時,它確實返回了以前的狀態名稱

問題是我無法在state_machine轉換中調用該方法以將其用作還原的目標狀態。舉例來說,像這樣的東西是行不通的:

event :restore do 
    transition :rejected => lambda {|wo| wo.previous_state} 
    end 

我得到的狀態是一個Proc。

我原以爲這是一個非常常見的用例(回到以前保存的狀態),但是我在搜索時發現了很少的信息。唯一相關的帖子是Using pluginaweek's state_machine, can I reference the activerecord object during an event?但是這不使用審計寶石提供的工作流歷史記錄,並且還將狀態返回到「恢復」狀態,這不是我所需要的。

有沒有人遇到過這個相同的用例?我對Ruby/Rails有點新鮮,我意識到這可能完全是由於我對lambda表達式和變量作用域缺乏理解,但我一直在爲這個問題奮鬥了幾天,並且確實可以使用一些幫助!

謝謝!

+0

Aww加油! _Tumbleweed_徽章? – SimonMD

回答

2

你打破了什麼樣的狀態機被認爲是。這有點像把一塊石頭扔進噴氣渦輪機裏。您的代碼在某些時候會變得不清楚,導致難以調試。

爲了讓你在這裏一個很好的故事是,我是不是很久以前面臨着一個問題,你要知道這是做作,可能不適合你的情況

我有一個用戶

+------------+ 
    |   | 
    v   | 
Active --> Suspended --> Removed 
    |   ^| 
    v   | | 
Inactive -----+ | 
^   | 
    |    | 
    +--------------+ 

您能否發現問題?如果我是一位非活動用戶且被暫停的用戶會發生什麼情況,我如何才能知道將用戶轉儲回來以激活他們?如果我是一名活躍的用戶,我將如何返回活躍狀態?

我想出瞭解決的辦法是刪除Suspended --> Inactive情況

TL;醫生認爲你的狀態和簡化他們或將在瘋狂的情況下之間的中間步驟。不要強迫某個不是爲此目的而設計的系統