28
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails・コントローラで使うインスタンス変数とローカル変数の違い

Posted at

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コントローラの場合、「メソッド間でのデータの受け渡し」も「ビューへのデータの受け渡し」もないので、ローカル変数で十分、ということになる。
(なのでおそらく、インスタンス変数を使っても正常に動く)

参考リンク

28
24
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
28
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?