gpt4 book ai didi

ruby - 是否存在在状态发生变化时执行事件转换的 Ruby/Rails 状态机?

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:40 26 4
gpt4 key购买 nike

希望这不是一个愚蠢的问题,我只是没有忽视 Ruby/Rails 状态机(AASM、Transitions、AlterEgo 等)中的某些东西。

据我所知,这些状态机实现在触发事件和根据新旧状态触发该事件的适当转换的前言上运行。但是,它们似乎并没有以其他方式起作用。假设用户想要将状态从“已创建”更改为“已分配”并发生正确的转换,而不是触发导致当前状态转换为新状态的事件。

本质上,我希望用户能够从可用状态的选择框中选择一个新状态,并执行适当的转换、守卫、成功回调等。

有谁知道现有的状态机实现是否支持这个?

最佳答案

状态机,就其本质而言,不允许您任意跳转到系统中的任何状态。每个都有一个入口点,每次您希望更改状态时,都会评估一些条件(其中一个可能是输入事件),下一个状态是这些条件的结果。不过,您可以拥有一个状态机,其中定义了从每个状态到其他状态的转换。

class Ticket
acts_as_state_machine :initial => :new

state :new
state :open
state :resolved

event :open do
transitions :to => :open,
:from => [:new, :resolved], :guard => :can_be_open?
end

event :new do
transitions :to => :new,
:from => [:open, :resolved], :guard => :can_be_new?
end

event :resolved do
transitions :to => :resolved,
:from => [:open, :new], :guard => :can_be_resolved?
end

private

def can_be_resolved?
!resolution.blank?
end

...

end

@ticket = Ticket.create
@ticket.state # => new
@ticket.resolved!
@ticket.state # => resolved

因此,您需要从下拉列表中检查所需的状态,然后调用正确的过渡。您可以使用像 attr_accessor :new_state 这样简单的东西,然后是您的模型调用 before_validationnew_state => event 映射或 case 语句。

关于ruby - 是否存在在状态发生变化时执行事件转换的 Ruby/Rails 状态机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com