我想做这样的事情:
MyController < ApplicationController
rescue_from ActiveRecord::StaleObjectError, :retry
我有一个应用程序,用户和管理员偶尔会同时更新同一对象,有时会发生冲突。这些操作的持续时间相当短,重试后应该会成功,因此最好在不涉及客户的情况下进行尝试。
如果这也发生在堆栈的另一层,那就没问题了。也许在机架的某个地方?
我在 Rails API 中查找了
retry
方法,但没有找到任何内容。我的互联网搜索和 Rails 讨论搜索也没有结果。当然,我可以将代码放入控制器中,如下所示,但我想对我拥有的所有操作执行此操作,而不是在各处重复。
def myaction
# do stuff
rescue ActiveRecord::StaleObjectError
retry
end
您可以尝试以下
class MyController < ApplicationController
rescue_from ActiveRecord::StaleObjectError, with: : retry_after_stale_object_error
def myaction
retry_on_stale_object_error do
# do stuff
end
end
private
def handle_stale_object_error
# Any addition stuff on failure if you want
retry
end
def retry_on_stale_object_error
tries = 1
begin
yield
rescue ActiveRecord::StaleObjectError
tries += 1
retry if tries < 3
# can add if retry attempts are over
raise
end
end
end
我希望这对你有帮助。 参考