Railsのコントローラー内で、render()
やredirect_to()
を複数書くと以下のようなエラーが出る場合があります。
AbstractController::DoubleRenderError: Render and/or redirect were called multiple times in this action.
対処方法は、エラーメッセージの続きにも表示されるとおり、render() and return
やredirect_to() and return
のように明示的にreturn
を付加することです。
アクセス状況に応じて、200OK以外の応答を返すことは普通に必要とされるため、これは基礎的な方法と言えます。
一点注意が必要なのは、すべてのケースに and return を付けてもエラーが出続ける場合があることです。
典型的な例としては、リクエストを受けたアクションからメソッドを呼び出して、そのサブメソッド内でrender()
などを呼んでいる場合があります。
これは、そのメソッドでand return
を呼んでも元のアクションに return しているだけで、アクション自体は return していない、という挙動になるようです。
一見適切に記述できているように見えるため、分かりにくいバグになります。
よって、render()
やredirect_to()
はルーティングで呼び出されたアクションメソッドに集約しておくことが重要です。
⁋ 2020/12/13↻ 2024/12/18
中馬崇尋
Chuma Takahiro
Chuma Takahiro