ruby state_在没有调用的情况下触发机器事件
这里是ruby新手,尝试使用ruby gemruby state_在没有调用的情况下触发机器事件,ruby,rubygems,state-machine,Ruby,Rubygems,State Machine,这里是ruby新手,尝试使用ruby gemstate\u 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
state\u 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
每当我调用要创建的类
Estado
的实例时,它就开始按照出现的顺序遍历所有事件,而不管我调用任何转换。我在这里的意图是创建一个基本状态,它根据需要程序的哪个功能而变化,然后事件可以将我们返回到该基本状态。执行代码是因为Ruby是一种解释语言。基本上,当解释器遇到代码行时,它会执行它
您必须区分状态机逻辑和业务逻辑。从你的解释来看,不太清楚什么是优势,但是:
-无论是否希望在状态转换时调用方法,请使用回调:
after_transition on: :decisao, do: ->(*) { Decisao.AnalisarPlanilha }
-无论是否要更改方法的状态,请显式调用事件:
def Decisao.AnalisarPlanilha
estado.decisao! # assuming estado in an instance of Estado class
end
旁注:在snake case(
analisar\u planilha
)中命名方法有一个常见的ruby约定,而不是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
根据您的要求,您可以在之前使用
,也可以在
之后使用您真的有一个名为
更新的类吗?我想把它改成别的,但不是动词。require_relative'Update';需要相对的“寄存器”
-小写名称。