4
7

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.

Sessionメソッドの使い方、宣言方法

Posted at

#目的
ログイン機能を実装するときにSessionメソッドを使用するが、
機能の流れをおさらいするために備忘録として残しておく。

#セッションとは?
・主にログイン機能に使用されるもので、ログイン状態を持続させるためにある機能。
・ステートフルな通信を実現するために必要な機能。

セッションという仕組みがなけれはページを移動するたびにログインし直さなければならない。

ログイン機能を実装するためRailsではあらかじめセッションを実装するためのメソッドが用意している。
また、セッションの情報はRailsの標準では、ブラウザ側のクッキーに保存される。

#Sessionメソッドの使い方
まずは、ユーザーを登録するためにユーザーモデルを準備する。
ユーザーモデルには、名前とメールとパスワードが登録できるようにします。

####gemをGemfileに追加
パスワードを暗号化するための
(コメントアウトされているためコメントインする必要がある)

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

これでユーザーモデルの作成は完成です。

次に作成したユーザモデルにパスワードの暗号化を有効にするための設定を加えます。

app/models/user.rb
has_secure_password

#####Sessionコントローラーを作成
ログイン機能を作成するためセッションコントローラーを作成する。

rails g controller sessions
app/controllers/session_sontroller.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])
      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[:~]

4
7
1

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
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?