Ruby on rails 转换回调后的状态机无法进行更新
我使用的是Ruby on rails 转换回调后的状态机无法进行更新,ruby-on-rails,state-machine,Ruby On Rails,State Machine,我使用的是Rails-4.2.6、state\u machine-1.2.0和Ruby-2.3 我已经在订单模型上定义了状态机。如下 state_machine :status, initial: :initiated do after_transition on: :succeeded, do: :oderable_success_callback event :pending do transition initiated: :pending end
Rails-4.2.6
、state\u machine-1.2.0和Ruby-2.3
我已经在订单模型上定义了状态机。如下
state_machine :status, initial: :initiated do
after_transition on: :succeeded, do: :oderable_success_callback
event :pending do
transition initiated: :pending
end
event :failed do
transition [:initiated, :pending] => :failed
end
event :succeeded do
transition [:initiated, :pending] => :succeeded
end
end
def oderable_success_callback
orderable.successful_payment
end
当我像下面这样更新顺序时,触发了_转换回调
order.成功
但当我将订单更新为时,它不会触发回调
order.update(status: 'succeeded')
状态
更新为“成功
”,但无法触发回调。
如何在正常的
更新顺序上触发转换后的回调。转换回调后不会触发更新。如果要检测列上的更改。您可以使用模型的更新后回调
class Order < ActiveRecord::Base
after_update :tasks
def tasks
if(self.status_changed? && status == 'succeeded')
oderable_success_callback
end
end
end
类顺序
根据状态,我有多个回调,并避免了多个if/else,我做了如下操作
after_update :orderable_callback
state_machine :status, initial: :initiated do
event :pending do
transition initiated: :pending
end
event :failed do
transition [:initiated, :pending] => :failed
end
event :succeeded do
transition [:initiated, :pending] => :succeeded
end
state :pending do
def orderable_callback
orderable.pending_payment
end
end
state :failed do
def orderable_callback
orderable.failed_payment
end
end
state :succeeded do
def orderable_callback
orderable.successful_payment
end
end
end
谢谢你的回复。实际上,根据状态,我有多个回调。如果我像这样触发,那么很多If/else需要编写。这很有趣。我不知道你可以像那样定义每个州的方法。但是,如果它处于未定义orderable\u回调的状态,它会做什么呢?(如:initiated状态)after_update回调不会失败吗?您需要在状态机之外定义orderable_回调方法,如果在状态机中未指定,该方法将被称为默认方法。对于initiated,它将调用defaultorderable\u callback