Webアプリケーションでは、ユーザーの新規登録時の際は自動的にログイン状態が保たれて欲しいですよね?
僕が通うプログラミングスクールのカリキュラムでは、上記のような実装はしておらず、ユーザーの新規登録時にログイン状態が保たれておらず、新たにログインし直さなければいけない仕様でした。
よりユーザービリティを向上したいと考えて、「ユーザーの新規登録時の際は自動的にログイン状態を保つ」ための実装を行ったので、整理がてら投稿いたします。
結論から申し上げますとusers_controller.rb
にsession[:user_id]=@user.id
を追加するだけですよ!
#前提
sessions_controller.rb
は下記の通りです。
login
メソッドでは、session[:user_id]にユーザーのidが保持されている状態を「ログイン状態」として定義しています。ここが重要なポイントです。
sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
email = params[:session][:email].downcase
password = params[:session][:password]
if login(email, password)
flash[:success] = 'ログインに成功しました。'
redirect_to @user
else
flash.now[:danger] = 'ログインに失敗しました。'
render 'new'
end
end
def destroy
session[:user_id] = nil
flash[:success] = 'ログアウトしました。'
redirect_to root_url
end
private
def login(email, password)
@user = User.find_by(email: email)
if @user && @user.authenticate(password)
# ログイン成功
session[:user_id] = @user.id
return true
else
# ログイン失敗
return false
end
end
end
#実装
users_controller.rb
にsession[:user_id]=@user.id
を追加します。
session[:user_id]にユーザーのidが保持されている状態が「ログイン状態」なので、session[:user_id]
に@user.id
を代入します。
たったこれだけです。
users_controller.rb
class UsersController < ApplicationController
before_action :require_user_logged_in, only: [:show]
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id #ここを追加
flash[:success] = 'ユーザを登録しました。'
redirect_to @user
else
flash.now[:danger] = 'ユーザの登録に失敗しました。'
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
#まとめ
以上が、Railsで「新規ユーザー登録後にログイン状態にする」方法となります。
ログイン(セッション)状態についてあらためて学び直す良いきっかけとなりました。