是否可以使用名稱安全地執行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
是否可以使用名稱安全地執行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
做些什麼,你可以包括你的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.submit
將review to accepted
過渡。
另請注意,不是調用事件,然後調用保存,您可以將!
附加到事件名稱,保存將在轉換完成後自動發生。
所以不是
object.submit
object.save
你可以簡單地調用
object.submit!
當我說過渡時,我的意思是事件。我試圖通過API使對象狀態可控。我應該使用'object.send(「#{params [:event]}!」)來執行事件嗎?還是有更好的方法來做到這一點? – makhan 2014-10-18 17:17:01
在這種情況下,您可以按照您所描述的方式在對象上使用「發送」。我建議設置你的aasm do塊,就像這樣:'aasm:whiny_transitions => false do''這樣會簡單地返回true或false,而不是在事件目前不成立時引發異常。它消除了您的包含檢查的需要。 – bigtunacan 2014-10-18 19:17:05
我在項目需要這也並創建了一個關注的做到這一點:https://gist.github.com/ spieker/a01966e2dd586b47b04f – 2015-05-23 06:07:21