これまでに作った機能について簡単にまとめていく。
今回は、

Gemのデフォルトではないログイン機能の作成

Gem deviseを使用する場合はこちら

使用モデル

Userモデル

カラム データ型
1 name string
2 mail string
3 password_digest string

モデルの作成

$ rails g model User name:string mail:string password_digest:string

mailカラムにユニーク制約を追加

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.string :mail, unique: true
      t.string :password_digest

      t.timestamps
    end
  end
end

マイグレーションの実行

$ rails db:migrate

Gemの導入

gem 'bcrypt'

パスワードのハッシュ化を行うGem
has_secure_passwordの使用が可能になる

バリテーションの追加

class User < ActiveRecord::Base
  validates :name, presence: true
  validates :mail, presence: true, uniqueness: true
  has_secure_password validations: true
end

validations: trueによりhas_secure_passwordのデフォルトのバリテーション
サインアップ時のpasswordの必須入力
passwordとpassword_confirmationの内容が一致することを追加

Userのルーティングの追加

Rails.application.routes.draw do
  resources :users, only: [:new, :create]
end

Userコントローラーの設定

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_path
    else
      render 'new'
    end
  end

  private
  
  def user_params
    params.require(:user).permit(:name, :mail, :password, :password_confirmation)
  end
end

サインアップ画面の作成

app/views/users/new.html.erb

<%= form_with(model: @user, local: true) do |f| %>  
  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :mail %>
  <%= f.email_field :mail %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation %>

  <%= f.submit "アカウントを作成する" %>
<% end %>

Session管理のルーティングの追加

Rails.application.routes.draw do
  resources :users, only: [:new, :create]
  resources :sessions, only: [:new, :create, :destroy]
end

sessionコントローラーの設定

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(mail: params[:session][:mail].downcase)
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      redirect_to root_path
    else
      flash[:danger] = 'ログインに失敗しました'
      render 'new'
    end
  end

  def destroy
    session.delete(:user_id)
    redirect_to new_session_path
  end

end

ヘルパーメソッドの作成

app/helpers/sessions_helper.rb

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

  def logged_in?
    current_user.present?
  end
end

current_userは、現在ログインしているユーザーを取得するメソッド
logged_in?は、ログインの有無を判別するメソッド

ヘルパーモジュールをインクルード

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end

ログインフォームの作成

app/views/sessions/new.html.erb

<%= form_with(scope: :session, url: sessions_path, local: true) do |f| %>

  <%= f.label :email %>
  <%= f.email_field :mail %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.submit "ログイン" %>
<% end %>

ログイン・ログアウトを行うヘッダーの作成

app/views/layouts/application.html.erb

<% if logged_in? %>
    <%= link_to "ログアウト", session_path(current_user.id), method: :delete %>
<% else %>
    <%= link_to "サインアップ", new_user_path %>
    <%= link_to "ログイン", new_session_path %>
<% end %>

以上で作成完了