让我们假设一个非常简单的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
to状态转换。paid
这是在带有 aasm 的状态机中处理此类事件转换的惯用方式吗?我阅读了所有标记的堆栈溢出问题aasm
和 gem 文档,但仍然对进行这些安全转换的最佳方法有疑问。