события ruby ​​state_machine запускаются без вызова - PullRequest
0 голосов
/ 29 июня 2018

Новичок в 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

Всякий раз, когда я призываю создать экземпляр класса Estado, он начинает проходить через все события в порядке появления, независимо от того, призывал ли я к каким-либо переходам. Мое намерение здесь состоит в том, чтобы иметь базовое состояние, которое меняется в зависимости от того, какая функция программы необходима, тогда событие может вернуть нас в это базовое состояние.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Похоже, вы запутались в том, как использовать конечные автоматы, вы должны использовать события для перехода в другое состояние и затем выполнять свою работу в блоке до / после перехода, в вашем случае это может быть

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 в зависимости от ваших требований

0 голосов
/ 29 июня 2018

Код выполняется, потому что Ruby является интерпретируемым языком. По сути, когда интерпретатор встречает строку кода, он выполняет ее.

Вы должны различать логику конечного автомата и бизнес-логику. Не совсем понятно, что превосходит ваше объяснение, но:

- хотите ли вы, чтобы при вызове состояний вызывались методы, используйте обратные вызовы:

after_transition on: :decisao, do: ->(*) { Decisao.AnalisarPlanilha }

- хотите ли вы, чтобы состояния изменялись из ваших методов, явно вызывайте события:

def Decisao.AnalisarPlanilha
  estado.decisao! # assuming estado in an instance of Estado class
end

Sidenote: существует общее соглашение о ruby ​​для именования методов в случае змеи (analisar_planilha), а не AnalisarPlanilha, поскольку все, что начинается с заглавной буквы, рассматривается как константа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...