ruby state_machine 事件在没有调用的情况下被触发
ruby state_machine events getting triggered without call
这里是 ruby 的新手,尝试使用 ruby gem state_machine
制作状态机。我的代码如下:
require 'rubygems'
require 'state_machine'
require_relative 'decisao'
require_relative 'Update'
require_relative 'Register'
class Estado
state_machine :state, initial: :base do
event :decisao do
transition :base => :decisao
Decisao.AnalisarPlanilha()
end
event :update do
transition :base => :update
Update.AtualizarPlanilha()
end
event :cadastro do
transition :base => :cadastro
Register.ExecuteRegister()
end
event :visualizar do
transition :base => :visualizar
Report.OnVisualize()
end
event :retornar do
transition any => :base
end
end
end
每当我调用要创建的 class Estado
的实例时,它就会开始按出现顺序处理所有事件,而不管我调用任何转换。我在这里的目的是拥有一个基本状态,它会根据需要的程序功能而变化,然后一个事件可以 return 我们进入该基本状态。
正在执行代码,因为 Ruby 是一种解释型语言。基本上,当解释器遇到这行代码时,它就会执行它。
你必须区分状态机逻辑和业务逻辑。不太清楚你的解释有什么优越性,但是:
— 是否要在状态转换时调用方法,使用回调:
after_transition on: :decisao, do: ->(*) { Decisao.AnalisarPlanilha }
— 无论您是否希望从您的方法中更改状态,显式调用事件:
def Decisao.AnalisarPlanilha
estado.decisao! # assuming estado in an instance of Estado class
end
旁注:有一个常见的 ruby 约定以蛇形 (analisar_planilha
) 而非 AnalisarPlanilha
命名方法,因为一切都以大写字母被视为 常量 .
看起来您对如何使用状态机感到困惑,您应该使用事件转换到不同的状态,然后在 before/after 块中进行转换工作,在您的情况下可能是
require 'rubygems'
require 'state_machine'
require_relative 'decisao'
require_relative 'Update'
require_relative 'Register'
class Estado
state_machine :state, initial: :base do
event :decisao do
transition :base => :decisao
end
event :update do
transition :base => :update
end
event :cadastro do
transition :base => :cadastro
end
event :visualizar do
transition :base => :visualizar
end
event :retornar do
transition any => :base
end
before_transition :base => :decisao do |estado|
Decisao.AnalisarPlanilha()
end
after_transition :base => :update do |estado|
Update.AtualizarPlanilha()
end
before_transition :base => :cadastro do |estado|
Register.ExecuteRegister()
end
after_transition :base => :visualizar do |estado|
Report.OnVisualize()
end
end
end
您可以根据需要使用 before
或 after
这里是 ruby 的新手,尝试使用 ruby gem state_machine
制作状态机。我的代码如下:
require 'rubygems'
require 'state_machine'
require_relative 'decisao'
require_relative 'Update'
require_relative 'Register'
class Estado
state_machine :state, initial: :base do
event :decisao do
transition :base => :decisao
Decisao.AnalisarPlanilha()
end
event :update do
transition :base => :update
Update.AtualizarPlanilha()
end
event :cadastro do
transition :base => :cadastro
Register.ExecuteRegister()
end
event :visualizar do
transition :base => :visualizar
Report.OnVisualize()
end
event :retornar do
transition any => :base
end
end
end
每当我调用要创建的 class Estado
的实例时,它就会开始按出现顺序处理所有事件,而不管我调用任何转换。我在这里的目的是拥有一个基本状态,它会根据需要的程序功能而变化,然后一个事件可以 return 我们进入该基本状态。
正在执行代码,因为 Ruby 是一种解释型语言。基本上,当解释器遇到这行代码时,它就会执行它。
你必须区分状态机逻辑和业务逻辑。不太清楚你的解释有什么优越性,但是:
— 是否要在状态转换时调用方法,使用回调:
after_transition on: :decisao, do: ->(*) { Decisao.AnalisarPlanilha }
— 无论您是否希望从您的方法中更改状态,显式调用事件:
def Decisao.AnalisarPlanilha
estado.decisao! # assuming estado in an instance of Estado class
end
旁注:有一个常见的 ruby 约定以蛇形 (analisar_planilha
) 而非 AnalisarPlanilha
命名方法,因为一切都以大写字母被视为 常量 .
看起来您对如何使用状态机感到困惑,您应该使用事件转换到不同的状态,然后在 before/after 块中进行转换工作,在您的情况下可能是
require 'rubygems'
require 'state_machine'
require_relative 'decisao'
require_relative 'Update'
require_relative 'Register'
class Estado
state_machine :state, initial: :base do
event :decisao do
transition :base => :decisao
end
event :update do
transition :base => :update
end
event :cadastro do
transition :base => :cadastro
end
event :visualizar do
transition :base => :visualizar
end
event :retornar do
transition any => :base
end
before_transition :base => :decisao do |estado|
Decisao.AnalisarPlanilha()
end
after_transition :base => :update do |estado|
Update.AtualizarPlanilha()
end
before_transition :base => :cadastro do |estado|
Register.ExecuteRegister()
end
after_transition :base => :visualizar do |estado|
Report.OnVisualize()
end
end
end
您可以根据需要使用 before
或 after