конечные автоматы / state_machine - следующее состояние в переходах - PullRequest
3 голосов
/ 10 октября 2019

Я использую https://github.com/state-machines/state_machines для Rails для хранения и выполнения работы до и после изменения состояния объекта.

Я хотел бы иметь один метод, который можетвызываться в before_transition для данного набора events, а для данного event, иметь метод, вызываемый before_transition, что-то немного по-другому.

Например, сказатьметод называется log_state_change, что-то вроде:

def log_state_change
  case <???>
  when "successful"
    Rails.logger.info "Successful"
  when "failure"
    Rails.logger.info "Failure"
  when "starting_run"
    Rails.logger.info "Starting run" 
  else
    Rails.logger.error "Unknown"
end

Я не могу найти методов, которые бы подходили для <???> выше. Может быть, кто-нибудь, более знакомый с этим драгоценным камнем, мог бы помочь, пожалуйста?

1 Ответ

2 голосов
/ 14 октября 2019

Вы можете принять аргумент для вашего обратного вызова before_transition и получить все данные, необходимые для реализации ожидаемого поведения.

Код, который передает аргумент, который вы можете найти в исходном кодебиблиотека . Вы также можете реализовать эту логику с помощью around_transition.

require 'state_machines'

class Light

  state_machine :state, initial: :off do

    before_transition from: any, do: :log_me

    event :light do
      transition all => :on
    end

    event :dark do
      transition [:on] => :off
    end

  end

  def log_me(transition)
    case transition.event
    when :light
      p "`light` event was called to transition from #{transition.from} to #{transition.to}"
    when :dark
      p "`dark` event was called to transition from #{transition.from} to #{transition.to}"
    else
      p "`#{transition.event}` was called to transition from #{transition.from} to #{transition.to}"
    end
  end
end

a = Light.new

a.light # => "`light` event was called to transition from off to on"
a.dark # => "`dark` event was called to transition from on to off"
...