我们有一个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源代码的内部来实现, 可以说,这可能不是一个好习惯。有什么想法吗?
只是想知道是否有人这样做过。
谢谢!
答案 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
对此实施有何评论?