我有以下状态:A
,:B
,:C
。
require 'state_machine'
class Example
property :value, String
def test_condition
value == "hmm"
end
state_machine :state, :initial => :A do
event :my_event do
transition [:A, :B] => :C, :if => :test_condition
transition :A => :B, :unless => :test_condition
end
end
def my_event
#Some Logic
end
end
当:test_condition
为真时,状态从:A
变为:C
,但当它为假时,两个状态都从:A
变为:B
,问题是当我的状态为:B
且:my_event
被触发时,在这种情况下,状态不会转到:C
并保持在:B
。我错过了什么吗?
我使用rubymine调试了我的代码,发现当状态为:B
且事件被触发时,断点不会停留在:test_condition
方法;它根本没有被调用。
文档一次只讨论if
或else
,并且没有提及与if State_1 else State_2
相关的内容。
答案 0 :(得分:2)
为什么要def my_event?我认为你应该使用:为此,我还将datamapper属性替换为plain attr_accessor。
以下是工作的代码:
require 'state_machine'
class Example
attr_accessor :value
def test_condition
value == "hmm"
end
state_machine :state, :initial => :A do
event :my_event do
transition [:A, :B] => :C, :if => :test_condition
transition :A => :B, :unless => :test_condition
end
end
end
ex = Example.new()
puts ex.state
ex.my_event
puts ex.state
ex.value ='hmm'
ex.my_event
puts ex.state
输出:
A
B
C