Rails

renderとredirect_toの違い(Rails)

3+

何気なく使っていたrenderとredirect_toだったので、それぞれの違いを整理してみたいと思います!

render

renderはActionView::Baseクラスのインスタンスに使用できるメソッドで、「レンダリング」という意味。ここでのレンダリングは、Webブラウザがサーバーからレスポンスで返ってきたHTMLファイルを解析して、画面に表示させることを意味する。
つまり、このrenderメソッドでは、Webブラウザが表示させるHTMLファイル(viewファイル)を引数として指定する必要がある。

色々なrenderの書き方

renderは色々な書き方があるので、それぞれの開発ルールに応じて書いた方が良いかもしれない。

その他オプションはRailsドキュメント参照

redirect_to

redirect_toはURL(HTTPリクエストメソッド)を指定することで、Webブラウザに新しい処理をリクエストを促すことである。なので、redirect_toにはURLを指定する必要がある。

色々なredirect_toの書き方

redirect_toは色々な書き方があるので、それぞれの開発ルールに応じて書いた方が良いかもしれない。

URLを指定する必要があるのに、下記のような書き方があることに疑問を持ったがいるかもしれません。

でも、この記述が本当に表している意味はこれです。

RailsはWebブラウザから受け取ったリクエストをroutes.rbで処理した上で、コントローラーに渡しており、それをコントローラーの◯◯アクションという言い方をしていますが、元をたどればURL(Webブラウザからのリクエスト)ということを思い出すと理解しやすいです。

renderとredirect_toの使い分け

では、この2つをどのように使い分けるのか?
ざっくり言うとこんな感じです。

■render    ⇒ データの取得
■redirect_to ⇒ データの追加、更新、削除

このように使い分ける理由は、それぞれの挙動を確認すると理解しやすくなります。

renderとredirect_toの挙動の違い

■render:
controller⇒表示したいviewファイルを指定
⇒viewはcontrollerから指定されたファイルをレスポンスとしてクライアント(Webブラウザ)に返す。
※viewに表示されるインスタンス変数は、この時点でcontrollerから生成されたインスタンス変数。

■redirect_to:
controller⇒クライアント(Webブラウザ)にリダイレクト先のURLを渡す
⇒クライアント(Webブラウザ)は渡されたURLでサーバーにリクエストを送信⇒routes.rbでリクエストを処理し、controllerに渡す
⇒controllerで、新たに処理を始め、新しいインスタンス変数を生成し、viewに渡す⇒viewは、新しいインスタンス変数をもとにHTMLファイルを生成し、レスポンスとしてクライアント(Webブラウザ)に返す。

上記のような挙動の違いから、追加、更新、削除した最新のデータ(新しいインスタンス変数)をブラウザに表示させたいのであれば、redirect_toを使用し、そうでなければrenderを使うことになる。

以下、簡単な記述例です。

コードを書く際は、そのコードが何を意味・意図しているのかを理解しているのとそうでないのとでは、今後エンジニアとして雲泥の差が出てきそうなので、注意しようと思います!

参考記事
https://qiita.com/jumpyoshim/items/ed10721c26963abdf121
https://qiita.com/1ulce/items/282cccba1e44158489c8
https://qiita.com/morikuma709/items/e9146465df2d8a094d78
https://qiita.com/ko8@github/items/c0e7d2511b569e2d892e

3+