我正在使用ruby state_machine来管理处理文档。随着文档的进展,SM状态管理所需的额外验证。
如果任何步骤失败,例如文档尺寸错误,我想记录下来,以便我可以通知正在等待转换完成的用户。
我的计划是使用SM after_failure来填充模型中的failed_at时间戳。轮询用户界面将看到处理失败并显示相应的消息。
我的问题是,如果转换失败,它会回滚事务,包括after_failure方法。这意味着用户永远不会发现处理失败,并且不幸地无限期地坐在屏幕前。
在下面的示例中,我希望:fail_transaction方法在转换失败的情况下运行。我愿意接受任何想法或其他方式来通知用户失败。
注意:
示例代码:
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
提前致谢!