如何调用给予和来自状态的Ruby gem AASM转换事件?

时间:2012-11-05 15:29:13

标签: ruby-on-rails ruby aasm

我们有一个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是变量,因此我们需要执行上述操作 动态。当然,对于某些到状态和从状态的组合,转换不可用,在这种情况下我们应该检测到错误。

我们也假设在任何两个状态组合(从状态和从状态)之间,只有1个事件,我认为理论上可以有超过1个。

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这是我的代码。 to_state和from_state是来自和来自的状态。

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

对此实施有何评论?