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
これで、簡易的なログイン機能の実装ができます。