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
これがお役に立てば幸いです。 参照