ruby 如何在staleObjectError的rescue_from中重试一个reconfigurable控制器操作

guz6ccqo  于 9个月前  发布在  Ruby
关注(0)|答案(1)|浏览(103)

我想做这样的事情:

MyController < ApplicationController
  rescue_from ActiveRecord::StaleObjectError, :retry

字符串
我有一个应用程序,用户和管理员偶尔会同时更新同一个对象,有时会发生冲突。这些操作的持续时间很短,重试应该会成功,所以如果不涉及客户端,尝试一下会很好。
如果这也发生在堆栈的另一层也没关系。也许是Rack的某个地方?
我在Rails API中查找retry方法,但没有找到任何东西。我的互联网搜索和Rails讨论搜索也没有结果。当然,我可以像下面这样将代码放入控制器中,但我希望对所有操作都这样做,而不是到处重复。

def myaction
  # do stuff
rescue ActiveRecord::StaleObjectError
  retry
end

nlejzf6q

nlejzf6q1#

你可以在下面试试

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

字符串
我希望这对你有帮助。

相关问题