#目的
ログイン機能を実装するときにSessionメソッドを使用するが、
機能の流れをおさらいするために備忘録として残しておく。
#セッションとは?
・主にログイン機能に使用されるもので、ログイン状態を持続させるためにある機能。
・ステートフルな通信を実現するために必要な機能。
セッションという仕組みがなけれはページを移動するたびにログインし直さなければならない。
ログイン機能を実装するためRailsではあらかじめセッションを実装するためのメソッドが用意している。
また、セッションの情報はRailsの標準では、ブラウザ側のクッキーに保存される。
#Sessionメソッドの使い方
まずは、ユーザーを登録するためにユーザーモデルを準備する。
ユーザーモデルには、名前とメールとパスワードが登録できるようにします。
####gemをGemfileに追加
パスワードを暗号化するための
(コメントアウトされているためコメントインする必要がある)
gem 'bcrypt', '~> 3.1.7'
コメントインが完了したらgemをインストールする必要がある。
bundle install
####Userモデルを作成
rails g model Users name:string email:string password_digest:string
password_digestというカラムにはパスワードが入ります。
こちらはgemであるbcryptの仕様ですが、このカラムにするとパスワードが暗号化されて保存されます。
migrationファイルが作成されたので、データベースに反映しましょう。
rails db:migrate
これでユーザーモデルの作成は完成です。
次に作成したユーザモデルにパスワードの暗号化を有効にするための設定を加えます。
has_secure_password
#####Sessionコントローラーを作成
ログイン機能を作成するためセッションコントローラーを作成する。
rails g controller sessions
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
redirect_to user_path(user.id)
else
render 'new'
end
end
end
ログインボタンを押した後に、セッションに情報が保存されているか判断しています。
user = User.find_by(email: params[:session][:email].downcase)
params[:session][:email]で、ユーザのポストでした値を取り出し、メールアドレスには小文字しか入力できないため.downcaseで小文字に変換しています。
その後find_byメソッドで入力したemailをカラムに保存されたemailが一致した場合にユーザーに代入しています。
次に、
if user && user.authenticate(params[:session][:password])
&&を使って、条件を2つ指定しています。
・user:userの中身があるかどうか
・user.authenticate:userに代入されたレコードのパスワードがポストした値と一致しているか
パスワードが登録しているユーザー情報と一致していたらセッションにユーザーIDを登録しています。
session[:user_id] = user.id
session[:名前]は名前をつけて、セッションを登録できます。
また、elseの場合、
render 'new'
パスワードが登録しているユーザ情報と一致していなかった場合、入力フォームに再度飛ぶように設定されている。
これでセッションを作成することができました。
#まとめ
#####セッションを作成する際に必要なものは以下である。
・パスワードを暗号化するためのgem:bcrypt
・gem:bcryptで暗号化したパスワードを保存するカラム:password_digest
・パスワードの暗号化を有効にするための設定:has_secure_password
・セッションを作成するためにメソッド:session[:名前] = params[:~]