かすたあどくりいむ定食

育児、プラモ、音楽(バンド)が趣味なエンジニア(かもしれない)ブログです。

Rails tutorial2週目やってみた3

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回目より明らかに理解が進んでいます。

では