はじめに
Qiita初投稿なので最初に少しだけ。
1か月ほど前にプログラミングの独学をし始め、現在はHTMLとCSSの基礎を終えて簡単なLPやサイトであれば模写してjQueryで軽く動きを付けられるくらいのレベルです。
恥ずかしながら現在ProgateでRuby on Railsを学習中です。
このレベルでQiitaに記事を書くのは大変申し訳なく思いますが、理解するのに少し時間がかかった点について、頭の中にあるふんわりとした概念を言語化して理解を定着させるためにも文章としてまとめたいと思います。
自身のインプットの質を高めるためのアウトプットですが、これからプログラミングを独学される方は多いと思うので、そういった方たちに向けても書いていきます。
また、まだまだプログラミング入門者ゆえに記述内容が間違っているかもしれないので、そういった場合はご指摘いただけると幸いです。
今回躓いた点
僕が今回躓いたのは、redirect_to
とrender
の引数がどちらともURLだと間違って理解していたためにエラーを発生してしまい少し躓きました。
redirect_to
は引数に"URL"を指定する*のに対して、renderは"フォルダ名/ファイル名"を指定します。
redirect_to("/posts/index") #「/posts/index」というURLを指定している
render("posts/index") #「postsフォルダ内にあるindexファイル」を直接指定している
ちなみに、render("/posts/index")
でも動作します。URLとして記述したのに動作していたことが今回の間違った理解につながっていました。
躓いたことによって、それぞれの引数が全く別のものを指していることを理解すると同時に、この二つのメソッドの動きについてもしっかりと理解できました。
今回は各メソッドの内側の動きについて書いていきます。
redirect_toとrenderは表面上の動きは似ているが内部の動きは大きく異なる
先ほども述べましたが、redirect_to
とrender
は表面上の動きは確かに似ていますが、表示するまでの内部の動作が大きく異なります。
どういう事かというと、例えば、引数をこんな感じで取る場合を考えてみましょう。
# どちらとも表面上は「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
メソッドと同じアクション内で定義した@変数をビューで使うことができる