Ruby 为什么说机器';是否在模型回调时未触发s事件?

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]

下面是我的模型代码,用于状态机功能的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]

    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::runmetrics
我对您提供的解决方案感到“stacklevel太深了”。嗯,我不确定它是否可以编写
表示从
是相同的事件……是的,机器可以在相同的状态下转换。