5

我正在尋找一個相對簡單的Rails 3/Active Record項目的狀態機插件。您推薦哪種狀態機插件用於Rails?

我已經做了一些研究,並提出了以下插件:

但他們看起來是非常相似的,所以我很好奇,想知道如果任何人有實世界上任何一個人的經驗。

謝謝!

+0

如果有助於瞭解他們的相對流行度,可以看看這裏:https://www.ruby-toolbox.com/categories/state_machines –

+0

評論:我們已經創建了[短視頻](http: //www.platform45.com/videos/show/10)解釋stateflow可能有所幫助。 – Neil

回答

12

state_machine似乎是一個人所說的使用,至少是我所說的。它與環境無關,因此您不必在應用程序的一部分中使用一個狀態機,而在應用程序的另一部分中使用完全不同的狀態機。

更新2015年2月

狀態機不幸不再保持,有很多問題,這使得它不太有利的選擇。但是,該項目的this fork得到積極維護並顯得穩定。

4

我結束了使用stateflow並喜歡它。 https://github.com/ryanza/stateflow

它與rails 3.0一起運行,它與幾個rails 3.0 beta版中的狀態機代碼相似,但是從最終版本中刪除。我沒有跟着去看看目前關於在rails中使用狀態機的想法是什麼 - 但我想如果一個狀態機在未來的版本中重新集成,它會有點像這樣。希望這將意味着最小的代碼更改,如果我想放棄創業板和使用核心功能

+0

我沒有聽說過這個 - 我非常喜歡它的語法。我只是將它添加到上面的列表中。 –

+0

Stateflow具有動態轉換(您可以通過某些業務邏輯確定下一個狀態)的好處,以防萬一您需要。 – crishoj

3

我會小心處理轉換。作者/提取者說他沒有時間維護它,並且通常在他的新項目中傾向於使用state_machine

另一方面,它確實有效(雖然檢查未解決的問題,看看它是否會在你的情況下工作)。我在一個項目中使用了Transitions,但是對於一個微不足道的狀態機。

我以前用過充當狀態機,在軌道2項目,它確實非常好(甚至是非常複雜的狀態機)

0

即使是最簡單的狀態機的寶石有這樣的特性比我需要,所以我決定推出我自己的解決方案。我嘗試過Transitions和Stateflow,但兩者都有小問題。

+0

知道你的選擇有些有趣,但我不確定這是否符合答案。爲什麼不把它作爲你的問題的更新? – iconoclast

+0

好點。我將把它作爲答案,但不要將其標記爲「答案」,因爲這實際上是一個開放式問題。 –

+0

要真正有資格成爲答案,難道你不認爲你應該分享你使用的代碼嗎?否則,這個問答的形式是「我該怎麼做X?」 「我以我自己的方式做了X」。 – iconoclast

2

SimpleStateMachine是一個簡單的DSL來裝飾現有的方法與狀態過渡警衛。

class LampSwitch 
    extend SimpleStateMachine 

    def initialize 
    self.state = 'off' 
    end 

    event :push_switch, :off => :on 
end 

lamp = LampSwitch.new 
lamp.state   # => 'off' 
lamp.off?   # => true 
lamp.push_switch # 
lamp.state   # => 'on' 
lamp.on?   # => true 

它與加載ActiveModel驗證,並允許事件與參數調用:

class User < ActiveRecord::Base 
    ... 
    def activate_account(activation_code) 
    if activation_code_invalid?(activation_code) 
     errors.add(:activation_code, 'Invalid') 
    end 
    end 
    event :activate_account, :invited => :activated 
end 

user = User.new 
user.activate_account!('INVALID') # => raises ActiveRecord::RecordInvalid 
user.activated?      # => false 
user.activate_account!('VALID') 
user.activated?      # => true 

它可以拯救例外:

def download_data 
    raise Service::ConnectionError 
end 
event :download_data, Service::ConnectionError => :download_failed 

user.download_data    # catches Service::ConnectionError 
user.state      # => "download_failed" 
user.state_machine.raised_error # the raised error 
0

我會建議Workflow,因爲我覺得它的最簡單的的所有狀態機可用。

相關問題