LoginSignup
4
1

More than 3 years have passed since last update.

【Ruby on Rails】混同しやすいredirect_toとrenderの動きと引数

Last updated at Posted at 2019-05-06

はじめに

Qiita初投稿なので最初に少しだけ。

1か月ほど前にプログラミングの独学をし始め、現在はHTMLとCSSの基礎を終えて簡単なLPやサイトであれば模写してjQueryで軽く動きを付けられるくらいのレベルです。

恥ずかしながら現在ProgateでRuby on Railsを学習中です。
このレベルでQiitaに記事を書くのは大変申し訳なく思いますが、理解するのに少し時間がかかった点について、頭の中にあるふんわりとした概念を言語化して理解を定着させるためにも文章としてまとめたいと思います。

自身のインプットの質を高めるためのアウトプットですが、これからプログラミングを独学される方は多いと思うので、そういった方たちに向けても書いていきます。

また、まだまだプログラミング入門者ゆえに記述内容が間違っているかもしれないので、そういった場合はご指摘いただけると幸いです。

今回躓いた点

僕が今回躓いたのは、redirect_torenderの引数がどちらともURLだと間違って理解していたためにエラーを発生してしまい少し躓きました。

redirect_toは引数に"URL"を指定する*のに対して、renderは"フォルダ名/ファイル名"を指定します。

qiita.rb
redirect_to("/posts/index")  #「/posts/index」というURLを指定している
render("posts/index")  #「postsフォルダ内にあるindexファイル」を直接指定している

ちなみに、render("/posts/index")でも動作します。URLとして記述したのに動作していたことが今回の間違った理解につながっていました。

躓いたことによって、それぞれの引数が全く別のものを指していることを理解すると同時に、この二つのメソッドの動きについてもしっかりと理解できました。

今回は各メソッドの内側の動きについて書いていきます。

redirect_toとrenderは表面上の動きは似ているが内部の動きは大きく異なる

先ほども述べましたが、redirect_torenderは表面上の動きは確かに似ていますが、表示するまでの内部の動作が大きく異なります。

どういう事かというと、例えば、引数をこんな感じで取る場合を考えてみましょう。

qiita.rb
# どちらとも表面上は「edit.html.erb」というビューを表示
redirect_to("/posts/index")
render("posts/index")

両者ともに表面上は「edit.html.erb」というビューを表示させます。(URL:/posts/indexのルーティングがindexアクションになっている場合。基本的にはこうなっていると思います。)

しかし、表面上は「edit.html.erb」を表示するだけですが、その内部の動きは全く異なります。

Railsの表示の仕組み

内部の動きの違いについて説明する前に、Railsにおける表示の仕組みについて軽く押さえたいと思います。
Railsでは、ブラウザからHTMLファイルを要求された際に以下の順番でHTMLをブラウザに渡します。
①ルーティング
②コントローラのアクション
③ビュー

ルーティングは、指定されたURLからどのコントローラどのアクションで処理をするのかを決定する対応表のような役割を持っています。
そして、ルーティングによって指定されたコントローラのアクションはコントローラと同じ名前のフォルダからアクション名と同じビュー(HTMLファイル)をブラウザに返してます。

redirect_toメソッドの実際の動き

表示までの大まかな流れが分かったところで話を戻します。
redirect_to("/posts/index")render("posts/index")は両者ともに表面上は「edit.html.erb」というビューを表示させますが、その内部の動きは大きく異なります。

redirect_toは指定したURLに転送するメソッドです。

URLを指定するので、先ほど説明した「①ルーティングを通って→②アクションを決定して→③ビューを表示する」という流れでビューを表示し、ブラウザからURLを指定された時と同じ動きをします。

renderメソッドの実際の動き

一方、renderルーティングやアクションを経由せずに直接ビューを表示することができます。

ルーティングとアクションを経由せず直接ビューを表示するので、renderメソッドと同じアクション内で定義した@変数をビューで使える点がredirect_toとの大きな違いです。

まとめ

  • redirect_toの引数は「"URL"」でrenderの引数は「"フォルダ名/ファイル名"」
  • redirect_toメソッドは引数でURLを指定するのでルーティングからアクションを通してビューを表示する
  • renderメソッドは引数で直接ビューを指定して表示するため、ルーティング→アクションを経由しないのでrenderメソッドと同じアクション内で定義した@変数をビューで使うことができる
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1