8章
sessionを使ったログイン
8章はsessionを使ったログインについてです。 ログインフォームではEメールとパスワードを入力させます。
こちらのフォームで入力されたparamsハッシュのsessionキー内に値が入ります
session: email: 'user@example.com' password: 'foobar' commit: Log in baction: create controller: sessions
つまり
{ session: { password: "foobar", email: "user@example.com" } }
で、これが
params[:session]
この中の
{ password: "foobar", email: "user@example.com" }
これで
params[:session][:email]
ここからデータを取得できるということです。
セッションコントローラーでは
def create user = User.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in user redirect_to user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end
セッションヘルパーでlog_inメソッドを定義
module SessionsHelper # 渡されたユーザーでログインする def log_in(user) session[:user_id] = user.id end end
そしてapplicationコントローラでヘルパーをインクルード
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include SessionsHelper end
ログインの際、変数userにfind_byで最新(入力された)のemailを小文字に変換して代入させてます。 authenticateメソッドで入力されたパスワードを暗号化し、DBに登録されているpassword_digestと一致するか検証し一致するならtrueを返しlog_inメソッドを実行します。 メソッドでuser.idをsession[:user_id]に代入しログイン状態にします。 そしてuserのページにリダイレクトします。
current_userメソッドでログイン中のユーザーを定義
def current_user if session[:user_id] @current_user ||= User.find_by(id: session[:user_id]) end end
ログアウト
ログアウト処理はセッションヘルパー内でログアウトメソッドを定義
def log_out session.delete(:user_id) @current_user = nil end
そしてセッションコントローラーでデストロイアクションを作成
def destroy log_out redirect_to root_url end
これでログアウトができます。
今回はsessionを使ったログインの流れをおさらいしました。やっぱり時間が立つと頭から抜けてたところが再発見できてよかったです。でも1回目より明らかに理解が進んでいます。
では