state_machine for if if&其他

时间:2012-11-23 16:04:32

标签: ruby state-machine

我有以下状态: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方法;它根本没有被调用。

文档一次只讨论ifelse,并且没有提及与if State_1 else State_2相关的内容。

1 个答案:

答案 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