1

我正在使用 ruby​​ state_machine来管理处理文档。随着文档的进展,SM 状态管理所需的额外验证。

如果任何步骤失败,例如文档尺寸错误,我想记录下来,以便通知正在等待转换完成的用户。

我的计划是使用 SM after_failure 在模型中填写 failed_at 时间戳。轮询用户界面将看到处理失败并显示适当的消息。

我的问题是,如果转换失败,它会回滚包括 after_failure 方法的事务。这意味着用户永远不会发现处理失败并且不幸的是无限期地坐在他们的屏幕前。

在下面的示例中,我希望 :fail_transaction 方法在转换失败的情况下运行。我愿意接受任何想法或替代方法来通知用户失败。

笔记:

  • 状态机的 :use_transaction => false 选项似乎没有什么不同。
  • 我考虑将失败转换放入工作队列中以逃避事务,但由于我正在使用delayed_job,因此队列条目也被回退。
  • 这个项目可耻地仍在 Rails 2.3.x 和 ruby​​ 1.8.x 上

示例代码:

state_machine :state, :initial => :new do

  state :new

  state :original_uploaded do
    validates_presence_of :original_file
  end

  state :original_converted do
    validates_presence_of :pdf
  end

  state :conversion_complete do
    validates :pdf_dimensions_correct
  end

  event :process do
    transition :new => :original_uploaded
    transition :original_uploaded => :original_converted
    transition :original_converted => :conversion_complete
  end

  after_transition :on => :process, :do => :process

  before_transition any => :original_converted, :do => :convert_original_to_pdf
  before_transition any => :conversion_complete, :do => :extract_pdf_metadata

  after_failure :on => :process, :do => :fail_conversion

end

def fail_conversion
  update_attribute(:failed_at, Time.now) # Should update dispite being invalid state
end

def convert_original_to_pdf
  #...
end

def extract_pdf_metadata
  #...
end

def pdf_dimensions_correct
  errors.add(...)
end

提前致谢!

4

0 回答 0