state-machines/state_machine - 转换中的下一个状态

state-machines/state_machine - Next state in transitions

我正在使用 https://github.com/state-machines/state_machines for 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

我找不到适合上述 <???> 的方法。也许更熟悉此 gem 的人可以提供帮助?

您可以在 before_transition 回调中接受参数并获取实现预期行为所需的所有数据。

您可以在 the source code of the library 找到传递参数的代码。您也可以使用 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"