如何针对 StaleObjectError 在rescue_from 中重试 ActionController 操作

问题描述 投票:0回答:1

我想做这样的事情:

MyController < ApplicationController
  rescue_from ActiveRecord::StaleObjectError, :retry

我有一个应用程序,用户和管理员偶尔会同时更新同一对象,有时会发生冲突。这些操作的持续时间相当短,重试后应该会成功,因此最好在不涉及客户的情况下进行尝试。

如果这也发生在堆栈的另一层,那就没问题了。也许在机架的某个地方?

我在 Rails API 中查找了

retry
方法,但没有找到任何内容。我的互联网搜索和 Rails 讨论搜索也没有结果。当然,我可以将代码放入控制器中,如下所示,但我想对我拥有的所有操作执行此操作,而不是在各处重复。

def myaction
  # do stuff
rescue ActiveRecord::StaleObjectError
  retry
end
ruby-on-rails ruby rails-activerecord rack
1个回答
0
投票

您可以尝试以下

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

我希望这对你有帮助。 参考

© www.soinside.com 2019 - 2024. All rights reserved.