使用pluginaweek'的state_machine,我可以在一个事件中引用activerecord对象吗?[英] Using pluginaweek's state_machine, can I reference the activerecord object during an event?

本文是小编为大家收集整理的关于使用pluginaweek'的state_machine,我可以在一个事件中引用activerecord对象吗?的处理方法,想解了使用pluginaweek'的state_machine,我可以在一个事件中引用activerecord对象吗?的问题怎么解决?使用pluginaweek'的state_machine,我可以在一个事件中引用activerecord对象吗?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试实现将对象转换为 :suspended 状态的"挂起"事件.但我需要能够"取消暂停",并返回到之前的状态.我在模型中添加了一个 previous_state 字段,但我看不到如何在事件块中访问它.

这是我试图实现的基本逻辑:

event :suspend do
  owner.previous_state = self.state
  transition [:new, :old] => :suspended
end

event :unsuspend do
  transition :suspended => owner.previous_state.to_sym
  owner.previous_state = nil
end

state_machine 文档不是很有帮助,我在网上找不到示例.有时很难知道如何向谷歌描述某事:)

推荐答案

在我看来这不是一个完美的解决方案,但我确实想出了如何完成我的任务:

state_machine :initial => :new do
  state :new

  state :old

  state :suspended
  before_transition :to => :suspended, :do => :set_previous_state

  state :unsuspended
  after_transition :to => :unsuspended, :do => :restore_previous_state

  event :suspend do
    transition any - :suspended => :suspended
  end

  event :unsuspend do
    transition :suspended => :unsuspended, :if => :previous_state_present?
  end
end

private

def previous_state_present?
  previous_state.present?
end

def set_previous_state
  self.previous_state = state
end

def restore_previous_state
  if previous_state
    self.state = previous_state
    self.previous_state = nil
  end
end

我首先在我的机器上添加了一个"未暂停"状态.虽然我从不希望某些东西保持这种状态,但我无法动态告诉 state_machine 我想取消挂起到什么状态.

我在挂起事件中添加了一个 before_transition 回调,用于保存挂起之前的状态.

我为 unsuspend 事件添加了一个 after_transition 回调,因此状态会立即更新到之前的状态,然后会清除之前的状态,以防止对象生命周期后期出现问题.

这并不完美.它可以工作,但它比仅将挂起和取消挂起事件创建为独立方法要复杂得多.我没有走那条路,因为我希望 state_machine 控制所有状态更改,并且突破它会消除对移入/移出无效状态、回调等的保护.

本文地址:https://www.itbaoku.cn/post/786650.html