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