【问题标题】:How to invoke Ruby gem AASM transition event given to and from states?如何调用给定状态的 Ruby gem AASM 转换事件?
【发布时间】:2012-11-05 15:29:13
【问题描述】:

我们有一个 Ruby on Rails 应用程序。

我们正在使用 Ruby 的 aasm gem 来管理对象的状态。

has_state
aasm do
    state :created, :initial => true
    state :submitted
    state :rejected
    state :approved

    event :submit do
        transitions :to => :submitted, :from => [:created]
    end

    event :mark_as_incomplete do
        transitions :to => :created, :from => [:submitted]
    end

    event :approve do
        transitions :to => :approved, :from => [:submitted]
    end

    event :reject do
        transitions :to => :rejected, :from => [:submitted]
    end
end

如果我们知道一个对象的当前状态,可以使用

object.aasm_current_state

我们也知道要转换到的状态,我们如何调用事件?

请注意,from-state和to-state是变量,所以我们需要做上面的 动态的。当然,对于某些 to-state 和 from-state 组合,转换是不可用的,在这种情况下我们应该检测到错误。

我们还假设在任意两个状态组合(to-state 和 from-state)之间,只有 1 个事件,我认为理论上可以超过 1 个。

我认为这可以通过深入研究 aasm 源代码的内部来实现, 可以说,这可能不是一个好习惯。有什么想法吗?

只是想知道以前是否有人这样做过。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby aasm


    【解决方案1】:

    AASM 没有提供这样做的方法,但您自己的答案已经足够接近您想去的地方了。 AASM 是围绕这样的假设构建的,即状态机允许从一种状态到另一种状态的多种不同转换。

    如果事件名称与您无关,您可以重用目标状态名称作为事件名称,如下所示:

    aasm do
      ...
      event :approved do
        transitions :from => :submitted, :to => :approved
      end
      ...
    end
    

    这样,您只需知道目标状态名称即可触发事件

    approval_request.send(to_state)
    

    默认情况下,如果不允许此转换,AASM 会引发异常。如果您不喜欢该异常,请将whiny_transitions 设置为false,如下所示:

    aasm :whiny_transitions => false do
       ...
    end
    

    【讨论】:

    • 谢谢。是的,这会奏效。虽然如果有人稍后更改事件名称,它将停止工作。我的代码更通用,因为它不依赖于事件名称。尽管我的代码采用了它在任何两个状态之间找到的第一个转换并执行它。正如你所说,可能还有其他过渡。
    【解决方案2】:

    这是我的代码。 to_state 和 from_state 是 from 和 to 的状态。

    ApprovalRequest.aasm_events.each do |event_key, event_obj|
        if event_obj.transitions_from_state?(from_state) &&
            event_obj.transitions_to_state?(to_state)
            self.approval_request.send "#{event_key.to_s}!"
        end
    end
    

    有关于这个实现的 cmets 吗?

    【讨论】:

    • 你需要得到这个 aasm gem 的分支(直到我的更改被合并到主 git 中):github.com/zackxu1/aasm
    • 现在我知道了,您需要 transitions_to_state? 做什么。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多