2014-10-17 41 views
1

是否可以使用名稱安全地執行AASM中的轉換?如何從控制器執行AASM中的轉換?

我現在做的AASM:

if order.aasm.events.include? params[:event] 
    order.send(params[:event]) 
    order.save 
end 

我可以state_machine

order.state_event = params[:event] 
order.save 
+1

我在項目需要這也並創建了一個關注的做到這一點:https://gist.github.com/ spieker/a01966e2dd586b47b04f – 2015-05-23 06:07:21

回答

0

做些什麼,你可以包括你的aasm do塊?我之前沒有使用過state_machine,但這不是典型的使用aasm。您不應該需要發送過渡;相反,您只需調用事件,並根據您創建的事件/轉換規則自動進行狀態轉換。

這是一個小例子。

aasm do 
    state :draft 
    state :review 
    state :accepted 
    state :rejected 

    event :submit do 
    transitions :from => :draft, :to => :review 
    transitions :from => :review, :to => :accepted 
    end 

    event :reject do 
    transitions :form => :review, :to => :rejected 
    end 
end 

現在,在上面的例子中,如果對象是在草稿狀態和你打電話object.submit它將從draft to review過渡,如果你是在審查狀態object.submitreview to accepted過渡。

另請注意,不是調用事件,然後調用保存,您可以將!附加到事件名稱,保存將在轉換完成後自動發生。

所以不是

object.submit 
object.save 

你可以簡單地調用

object.submit! 
+0

當我說過渡時,我的意思是事件。我試圖通過API使對象狀態可控。我應該使用'object.send(「#{params [:event]}!」)來執行事件嗎?還是有更好的方法來做到這一點? – makhan 2014-10-18 17:17:01

+0

在這種情況下,您可以按照您所描述的方式在對象上使用「發送」。我建議設置你的aasm do塊,就像這樣:'aasm:whiny_transitions => false do''這樣會簡單地返回true或false,而不是在事件目前不成立時引發異常。它消除了您的包含檢查的需要。 – bigtunacan 2014-10-18 19:17:05

相關問題