让我们假设一个非常简单的Payment
类,如下所示:
class Payment
include AASM
aasm do
state :created
state :paid
state :refunded
event :pay do
transitions from :created, to :paid
end
end
end
因此,可以致电payment.pay
来触发付款,进行相应的API调用。
非常重要的是,如果付款实际成功,则只会发生从created
到paid
的转换。
1)我认为API调用应放在before
事件的:pay
回调中,但如果API调用不成功则不会停止转换(让我们假设API调用不引发异常,它只返回一个状态)。
2)然后我认为我应该将before
回调与警卫结合起来;使用before
回调来调用API,并在模型上设置它的结果(例如使用attr_accessor
)。然后,如果付款成功,警卫只允许其从created
转换为paid
状态。
这是在使用aasm的状态机中处理此类事件转换的惯用方法吗?我读了标记为aasm
的所有堆栈溢出问题和gem文档,但仍然有问题是什么是实现这些安全转换的最佳方法。