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

时间:2019-10-09 21:08:22

标签: ruby-on-rails ruby state-machine

我正在使用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

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

1 个答案:

答案 0 :(得分:2)

您可以在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"