gemを使わずログイン・ログアウト機能実装

gemを使わないログイン機能の実装方法について忘れてしまいがちなので、やり方をメモしておきます。

 

 

userモデルファイルに、has_secure_password を追記します。

userモデルファイルに、has_secure_password を追記します。

これによって、

①ハッシュ化したパスワードをpassword_digestという属性に保存できるようになります。

②passwordとpassword_confirmationが使えるようになります。

③authenticateメソッドが使えるようになります。

 

class User < ApplicationRecord
has_many :tasks
has_secure_password
validates :name, presence: true
VALID_EMAIL_REGEX = /A[w+-.]+@[a-zd-.]+.[a-z]+z/i
validates :email, presence: true, uniqueness: true, format: {with: VALID_EMAIL_REGEX}
validates :password, presence: true, length: {minimum: 6}
end

 

 

 usersテーブルにpassword_digestというカラムを加えます。

 usersテーブルにpassword_digestというカラムを加えます。

以下のコマンドを実行し、マイグレーションファイルを作成します。

$ rails g migration AddPasswordDigestToUser

class AddPasswordDigestToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :password_digest, :string
end
end

上記のように編集し、

rake db:migrate を実行します。

 

sessionsコントローラーを作成します。

以下のコマンドを実行し、sessionsコントローラーを作成します。

$ rails g controller sessions 

そして、以下のようにcreateアクション、destroyアクションを記述します。

class SessionsController < ApplicationController
def new
end

def create
user = User.find_by(email: params[:session][:email])
if user
log_in user
redirect_to user_path(current_user)
else
flash[:notice] = 'invalid email/password combination'
render :new
end
end

def destroy
session.delete(:user_id)
@current_user = nil
redirect_to login_path
end
end

 

ヘルパーを使えるようにします。

ヘルパーを使えるようにしたいので、application_controller.rbに、

include SessionsHelper と追記します。

class ApplicationController < ActionController::Base
include SessionsHelper
end

 

ヘルパーを定義します。

SessionsHelperにloginメソッドとcurrent_userメソッドを記述します。

module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end

def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
end

 

ルーティングを定義します。

sessions#new、sessions#create、sessions#destroy のルーティングを定義します。

Rails.application.routes.draw do
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
resources 'users'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :tasks do
collection do
get 'sort_deadline'
get 'narrow_down_status'
end
end
root 'tasks#index'
end

 

ビューを作成します。

ログインフォームのビューを作成します。

div.margintop_big.fontsize_midium
| ログイン
div.margintop_big

= form_with scope: :session, url: login_path, local: true do |f|
div
= f.label :email
= f.text_field :email
div
= f.label :password_digest
= f.text_field :password_digest
div
= f.submit value: "ログイン", class: 'btn light-blue accent-2'

div.margintop_big
= link_to "新規登録", new_user_path

 

これで、簡易的なログイン機能の実装ができます。