1

让我们假设一个非常简单的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例如)。然后,如果支付成功,守卫将只允许它从createdto状态转换。paid

这是在带有 aasm 的状态机中处理此类事件转换的惯用方式吗?我阅读了所有标记的堆栈溢出问题aasm和 gem 文档,但仍然对进行这些安全转换的最佳方法有疑问。

4

0 回答 0