🐸

【Rails】今更だけど、超シンプルにrenderメソッドとredirect_toメソッドの違いを駆け出しVimmerがまとめてみた

2021/05/29に公開約2,000字

1.この記事の対象者

以下の人に向けてこの記事を書いています。

  • Railsを学習したことがある方
  • renderメソッドとredirect_toメソッドの挙動を知りたい方
  • renderメソッドとredirect_toメソッドの違いを知りたい方

結論が早く知りたい方は5章から読むことをお勧めします。

2.この記事を書いた理由

以下の理由でこの記事を書いています。

  • 自分の勉強したことをアウトプットしたい為。
  • この2つのメソッドの違いをもっとシンプルにまとめられるのではと感じた為。

3.renderメソッドとは?

renderメソッドは、特定のアクションに対応したビューをユーザーに提供する際に使うメソッドです。renderメソッドは基本、コントローラのアクション内に書きます。しかし、必ずしもrenderメソッドをアクション内に書く必要はありません。もし書かなかった場合、Railsの規約に従って、暗黙的にrenderメソッドを動作させます。代表的な例として、indexアクションやshowアクションです。indexアクションやshowアクション内ではrenderメソッドを書いていませんが、それはRailsが暗黙的にrenderメソッドを動作させているからです。この場合、アクション名と同じ名前のビューをHTTPレスポンスとして出力します。間違いやすい点としては、renderメソッドは特定のアクションに対応したビューをユーザーに提供するだけであり、指定したビューに対応するアクションは実行しません。(さらにすごく細かい話ですが、renderメソッドで呼び出すビューにはrenderメソッドを呼び出したアクション内で生成された変数を組み込むことができます。)

長々と説明しましたが、ざっくりまとめると、renderメソッドはあるビューをユーザーに提供する為に使うメソッドなのです。

4.redirect_toメソッドとは?

redirect_toメソッドは、ブラウザに別のURLでHTTPリクエストを送って欲しいと指示するメソッドです。このメソッドも基本はコントローラのアクション内に書きます。このメソッドの特徴はブラウザ側に再度HTTPリクエストを発行させている点です。分かりづらいので、以下にあるアクション内でredirect_toメソッドを使った際の挙動をまとめます。

  1. redirect_toメソッドを呼び出して、再度別のURLでHTTPリクエストを送って欲しいという内容のHTTPレスポンスをブラウザに返す。
  2. ブラウザがHTTPレスポンスを受け取る。(ステータスコード302)
  3. ブラウザが再度HTTPリクエストを送信する。
  4. HTTPリクエストに対応したコントローラ内のアクションが実行される。
  5. アクション終了後にrenderメソッドによってビューをHTTPレスポンスとしてブラウザに返す。(このrenderメソッドは暗黙的に動作している場合もあります。)

redirect_toメソッドの役割は再度別のURLでHTTPリクエストを送って欲しいとブラウザに指示するだけです。結局redirect_toメソッドまたはrenderメソッドのどちらを使っても、ビューを返す役割はrenderメソッドによって実行されます。

5.結局renderとredirect_toをどう使い分けるか?

アクション実行後にHTTPレスポンスを返すためには、renderメソッドまたはredirect_toメソッドのどちらかを呼び出さなければいけません。基本的にはrenderメソッドでいいのですが、アクション終了後に他のアクションを実行したい場合や、他のサイトへ接続したい場合、redirect_toメソッドを使用してHTTPリクエストを再度送信し直すのがベストです。

まとめると、ビューを返すだけならrenderメソッドでいいですが、アクション終了後にあるアクションを実行したい場合や他のサイトへ接続したい場合にはredirect_toメソッドを使用します。

6.終わり

renderメソッドとredirect_toメソッドは同じような挙動をしているので、違いが分かりづらいです。この記事を通して、一人でも多くの人の問題が解消されれば幸いです。

7.参考文献

https://gustavocguimaraes.wordpress.com/tag/render-vs-redirect_to/
https://www.amazon.co.jp/独習Ruby-Rails-小餅-良介/dp/4798160687

Discussion

ログインするとコメントできます