redirect_to @userというコードでなぜuserのトップページに遷移出来るのか?
「編集ボタン押下後、ユーザー自身の詳細ページへ遷移する」というコードがあるのですが、なぜこういう風に動くんだろうと気になったので調べてみました。
ご指摘などあれば是非お願い致しますm(__)m
結論
redirect_to @user
このコードは色んなものが省略されていて、
redirect_to user_url(@user.id)の略だった。
学んだこと
〇〇〇_urlと〇〇〇_pathはurlヘルパーで、戻り値としてルートURLを返してくれる
戻り値とは?
プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値
アクション内にあるメソッドの処理が終わった後に渡す値と解釈しました。
urlとpathの違いは?
urlは戻り値に絶対パスを返す
例、https://~~/users/:id
pathは戻り値に相対パスを返す
例、/users/:id
チュートリアルの5.3.2には、
railsの規約には基本的にリンクには相対パスを使うようにとあるが、redirectのリンクには絶対パスを利用すべき
とある。
なので普段使いはpath、
redirectの時はurlを使う。
今回はredirectに対して使うので、
redirect_to user_url(@user.id)
となる。
いまいち違いがわからずpathとurlを使っていたので勉強になった!
そして、user_url(@user.id)の戻り値は絶対パス
https・・・/users/:id
ボタン押下時のpathにはshow_pathを使用しており、ルーティングの中でこれに一致するコントローラーとアクションを確認すると、
get 'show' => 'users#show'
なのでusersコントローラーのshowアクションを参照する。
つまり、編集ボタンを押すとshowアクションが実行され、ユーザーの詳細ページに遷移する。
そして、
リンク先のパスとしてモデルオブジェクト(今回の場合は@user)が渡された場合、
Railsにはオブジェクトを一意に表す値、つまり、idを取得し、URLへ自動的に組み込む仕組みがある。
そのため、@user.idのidは省略出来る。
最終的には、redirect_to @userは、redirect_to user_url(@user.id)と等価となります。
なので、redirect_to @userとなります!
めちゃくちゃ勉強になりました。