Techioz Blog

StaleObjectError に対して、rescue_from 内で ActionController アクションを再試行するにはどうすればよいですか?

概要

次のようなことをしたいです:

MyController < ApplicationController
  rescue_from ActiveRecord::StaleObjectError, :retry

ユーザーと管理者が同じオブジェクトを同時に更新することがあり、衝突することがあります。アクションの有効期間はかなり短く、再試行で成功するはずなので、クライアントを関与させずに試してみることをお勧めします。

これがスタック内の別の層でも発生しても問題ありません。おそらくラックのどこかでしょうか?

Rails API で再試行メソッドを探しましたが、何も見つかりませんでした。インターネット検索や 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

これがお役に立てば幸いです。 参照