AbstractController::DoubleRenderErrorの直し方

Railsのコントローラー内で、render()redirect_to()を複数書くと以下のようなエラーが出る場合があります。

AbstractController::DoubleRenderError: Render and/or redirect were called multiple times in this action.

対処方法は、エラーメッセージの続きにも表示されるとおり、render() and returnredirect_to() and returnのように明示的にreturnを付加することです。

アクセス状況に応じて、200OK以外の応答を返すことは普通に必要とされるため、これは基礎的な方法と言えます。

一点注意が必要なのは、すべてのケースに and return を付けてもエラーが出続ける場合があることです。
典型的な例としては、リクエストを受けたアクションからメソッドを呼び出して、そのサブメソッド内でrender()などを呼んでいる場合があります。

これは、そのメソッドでand returnを呼んでも元のアクションに return しているだけで、アクション自体は return していない、という挙動になるようです。
一見適切に記述できているように見えるため、分かりにくいバグになります。

よって、render()redirect_to()はルーティングで呼び出されたアクションメソッドに集約しておくことが重要です。

⁋ 2020/12/13↻ 2024/11/07
中馬崇尋
Chuma Takahiro