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

您可以根据需要使用 beforeafter