我正在使用 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
提前致谢!