Rails AASM;如果发生特定转换,如何执行某些操作

时间:2017-02-22 10:01:47

标签: ruby-on-rails aasm

我在rails上使用名为AASM的状态机gem。

有一个事件有两种类型的转换。

三种三种状态

state pending
state past_due
state paid

pending可以更改为paid past_due可以更改为paid

  event :pay do
      transitions from: [:pending, :past_due], to: :paid
  end

所以,我希望只有past_due成为paid才能采取行动。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这样做的一种方法是在两个单独的语句中定义转换:

event :pay do
  transitions :from => :pending, :to => :paid
  transitions :from => :past_due, :to => :paid, :after => do_your_custom_action
end

详细了解回调in the docs

答案 1 :(得分:0)

您可以将after回调附加到转换和事件。

由于两个转换的事件都相同,因此您应该将回调附加到从past_duepaid的特定转换。

当您在单个转换中覆盖两个流时,第一步是为此流进行单独转换并将回调附加到它。如,

transitions :from => :past_due, :to => :paid, :after => your_required_action

答案 2 :(得分:0)

就个人而言,我将一个块传递给after回调

event :pay do
  after do
    # do_something
  end
  transitions from: [:pending, :past_due], to: :paid
end

这样我确保在do_something完成后执行event :pay

另一种方法是将回调附加到transitions,其中回调完成后将执行回调。

请查看文档和read about callbacks及其调用以满足您需求的顺序