Rails turtorialの7.4.1「フォームの完成」の章をやっている際、redirect_to @userでなぜユーザーページにリダイレクトのか分からず詰まったのでそれに関して説明していきます。
まず初めに以下のコードをご覧ください。
class UsersController < ApplicationController
.
.
.
def create
@user = User.new(user_params)
if @user.save
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
end
ここで、
redirect_to @user
といった行がありますが、これは次のコードと等価になります。
redirect_to user_url(@user)
これはredirect_to @user
というコードからuser_url(@user)
といったコードを実行したいということを、Railsが推察してくれた結果になります。
つまりuser_urlにリダイレクトするという記述が省略されているという事。
ではここで、次の疑問としてuser_url(@user)
の(@user)
は何を表しているのという疑問があります。
これは結論から言うとuser_url
にリダイレクトした時にエラーを返さない様にする為です。
基本的にuser_url
は/users/:id
の様なURLになっていることが多いです。
redirect_to user_url
だけでは:id
の部分に何が入るのか分からない為、/user/:id
にアクセスした時にエラーとなります。
この:id
の部分に何が入るかを指定するのが(@user)
の部分です。
引数に@user
と指定することでその変数に格納されたレコードに該当するページへのURLとなります。
つまりこの(@user)
はインスタンス変数ではなく:id
を入れる為にあるもの。
まとめると、
・redirect_to @user
というコードはuser_url(@user)
といったコードを実行したいということを、Railsが推察してくれた結果である。
・(@user)
はuser_url
にリダイレクトした時にエラーを返さない様にする為にある。