Ruby 为什么说机器';是否在模型回调时未触发s事件?
下面是我的模型代码,用于状态机功能的gem是“state\u machines-activerecord”:Ruby 为什么说机器';是否在模型回调时未触发s事件?,ruby,state-machine,ruby-on-rails-6,Ruby,State Machine,Ruby On Rails 6,下面是我的模型代码,用于状态机功能的gem是“state\u machines-activerecord”: class Response < ApplicationRecord state_machine initial: :created do after_transition on: :fire_answered, do: [:run_metrics] after_transition on: :fire_review, do: [:check_review]
class Response < ApplicationRecord
state_machine initial: :created do
after_transition on: :fire_answered, do: [:run_metrics]
after_transition on: :fire_review, do: [:check_review]
event :fire_sent do
transition from: [:created, :sent], to: :sent
end
event :fire_review do
transition from: [:sent, :answered], to: :review
end
event :fire_answered do
transition from: [:sent, :review, :answered], to: :answered
end
end
before_save :set_appropriate_events
def set_appropriate_events
self.state_event = 'fire_sent' if sent_time.present? && response_time.blank?
self.state_event = 'fire_answered' if sent_time.present? && response_time.present?
self.state_event = 'fire_review' if needs_review?
end
end
类响应
回调运行“self.state\u event”的值也会根据条件设置,但不会触发事件,也不会更新任何状态。若要触发事件,应使用模型实例调用该方法。 示例:
model\u实例.事件\u名称
因此,在您的情况下,您可能需要像下面这样使用
def set_appropriate_events
self.fire_sent if sent_time.present? && response_time.blank?
self.fire_answered if sent_time.present? && response_time.present?
self.fire_review if needs_review?
end
只需调用事件,它就会工作您使用此gem的方式不对。如果仅希望在保存后更新到特定状态,则直接将所需的状态值指定给实例的属性
def set_appropriate_events
self.state = "sent" if sent_time.present? && response_time.blank?
self.state = "review" if sent_time.present? && response_time.present?
self.state = "answer" if needs_review?
end
注意:上述代码不会触发gem的回调
(如转换后的)
如果要执行特定任务并在保存后更新状态,请不要使用状态机转换,在回调方法中调用机器方法
def set_appropriate_events
if sent_time.present? && response_time.present?
self.state = "review"
run_metrics
end
...
end
顺便说一句:如果[after | before]transition中只有一件事要做,我就不会使用数组。after | before]transition on::fire回答,do::runmetrics
我对您提供的解决方案感到“stacklevel太深了”。嗯,我不确定它是否可以编写
表示从到的和到
是相同的事件……是的,机器可以在相同的状态下转换。