状态机/状态机-转移中的下一个状态。

3
我正在使用 https://github.com/state-machines/state_machines 来存储对象状态变化前后的工作。我希望有一个单一的方法可在给定集合的“事件”之前被调用,并且对于给定的“事件”,由“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
你的意思是所有这些都应该像'successful':successful这样作为值而不是变量吗?我猜测case state可以完成任务,它会返回一个字符串。永远不要低估Rails.logger.info(state.titleize)这样的东西。 - tadman
我确实在转换状态,但是我正在转变为的状态,而不是我当前所处的状态。我会更新问题以反映这个状态字符串。 - CDub
1个回答

2
你可以在你的 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接