0

次の状態があります: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が true の場合、状態は からに:Aなり:Cますが、false の場合、両方の状態は から:Aになります:B。問題は、状態が:Bであり、:my_eventトリガーされた場合です。何か不足していますか?:C:B

rubymine を使用してコードをデバッグしたところ、状態が atでイベントがトリガーされたときに、ブレークポイントがメソッド:Bで停止しないことがわかりました。:test_conditionまったく呼び出されません。

ドキュメントではiforについてelseは一度に 1 回しか議論されておらず、 に関連するものについては何も言及されていませんif State_1 else State_2

4

1 に答える 1

2

なぜ my_event を定義するのですか? これには :do を使用する必要があると思います。また、datamapper プロパティをプレーンな 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
于 2012-11-23T18:03:26.640 に答える