(state_machine gem)如何在状态机中使用实例变量?

时间:2015-12-03 21:38:43

标签: ruby state-machine

我试图通过将口香糖机作为状态机来实施讲座。目的是用0个硬币和10个口香糖进行初始化。默认情况下,它已准备就绪;你插入一个硬币,并从那里request_refund或turn_crank。转动曲柄将使硬币计数器增加1,同时递减硬币计数器(并返回随机的口香糖颜色)。如果剩下0个口香糖球,那么转动曲柄就什么都不做。

if @gumballs > 0

但是,在@gumballs语句中失败,因为此时尚未定义{{1}}。我已经来回阅读文档并用Google搜索了它,但我不知道这个或我应该做什么错了。

2 个答案:

答案 0 :(得分:2)

在状态机中无法访问实例变量,但是当您将其设置为attr_accessor时,您可以通过传递gumball机器对象来访问它。

有一个before_transition回调来完成你的配药。

before_transition holding_coin: :ready do |machine, transition|
  machine.dispense_gumball if machine.gumballs > 0
end

event :turn_crank do
  transition :holding_coin => :ready
end

答案 1 :(得分:1)

event块内的上下文与方法定义中的上下文不同。我猜测self引用了事件,而不是在事件块中调用GumballMachine

state_machine docs包含一个说明这一点的示例:

event :crash do
  transition all - [:parked, :stalled] => :stalled, :if => lambda {|vehicle| !vehicle.passed_inspection?}
  end
end

在示例vehicle中引用实例,passed_inspection?是实例上的方法。

对于您的情况,您可以考虑添加一个方法(例如has_gumball?),然后该方法可以访问实例变量。