ruby state_在没有调用的情况下触发机器事件

ruby 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

这里是ruby新手,尝试使用ruby gem
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';需要相对的“寄存器”
-小写名称。