Railsチュートリアルの第8章で疑問が生じた。
それはなぜ、Sessionsコントローラにおける変数の定義を、インスタンス変数ではなくローカル変数で行うのか?というところだった。
以下のコードを見るt、「@user」ではなくローカル変数「user」に代入を行っている。
sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
# redirect_to user_url(user) と同じ意味
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
end
end
例えば、Usersコントローラーでは、インスタンス変数の@userに代入を行っている。
インスタンス変数とローカル変数を使うケースの違いはどこにあるのだろうか?
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
end
調べた結果、こちらに書いてありました。
曰く、
Railsのコントローラでインスタンス変数を使用するのは、以下の場合です。
・メソッド間でのデータの受け渡し(典型的には、before_actionでデータをロードしておくとか)
・ビューへのデータの受け渡し
Sessionsコントローラの場合、「メソッド間でのデータの受け渡し」も「ビューへのデータの受け渡し」もないので、ローカル変数で十分、ということになる。
(なのでおそらく、インスタンス変数を使っても正常に動く)