ホーム > カテゴリ > Ruby・Ruby on Rails >

ログイン機能をつくる [Ruby on Rails]

Rails6でログイン機能を作る方法です。今回はDeviseは使用しません。

作るもの

前提条件

今回はBootstrap4、Slimを使用します。

Bootstrap4、Slimの導入は
Rails6プロジェクトの各種初期設定をご覧ください。

1. 初期設定

// Userモデルの作成(モデル/マイグレーションファイルの生成)
bin/rails g model User name:string email:string password_digest:string admin:boolean

// マイグレーションの実行(テーブルの生成)
bin/rails  db:migrate

//  コントローラー/ビューの生成
bin/rails g controller login new

// bundle install
Gemfileのgem 'bcrypt'のコメントを外してbundleを行う。

2. 各コード

2-1. app/models/user.rb

class User < ApplicationRecord

  validates :name, presence: true
  validates :email, presence: true, uniqueness: true  

  # password_digest用
  has_secure_password
    
end

2-2. app/views/layouts/application.html.slim

doctype html
html
  head
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_link_tag 'application', media: 'all'
    = javascript_pack_tag 'application'
  body
    .container  
      - if flash.notice.present?
        .alert.alert-success= flash.notice    
      - if flash.alert.present?
        .alert.alert-danger= flash.alert  
        
      = yield

2-3. app/views/login/new.html.slim

p
h1 ログイン
p

- if session[:user_id].present?
  p
    span = session[:user_name].to_s + 'さんでログインしています。' 
    span = link_to 'ログアウト', logout_path, method: :delete
      
p
= form_with scope: :login, local: true do |f|
  .form-group
    = f.label :email, 'メールアドレス'
    = f.text_field :email, class: 'form-control', id: 'login_email'
  .form-group
    = f.label :password, 'パスワード'
    = f.password_field :password, class: 'form-control', id: 'login_password'
  = f.submit 'ログインする', class: 'btn btn-primary'

2-4. app/controllers/login_controller.rb

class LoginController < ApplicationController
  def new
  end
  
  def create
    user = User.find_by(email: login_params[:email])

    # パスワードの認証
    if user&.authenticate(login_params[:password])
      session[:user_id] = user.id
      session[:user_name] = user.name
      redirect_to login_path, notice: 'ログインしました。'
    else
      render :new
    end
  end
    
  def destroy
    reset_session
    redirect_to login_path, notice: 'ログアウトしました。'      
  end
    
  private

  def login_params
    params.require(:login).permit(:email, :password)
  end    
end

2-5. config/routes.rb

Rails.application.routes.draw do
  get  '/login', to: 'login#new'
  post '/login', to: 'login#create'
  delete '/logout', to: 'login#destroy'
end

ルーティング名(xxx_path)は「rake routes」で確認できます。

3. Railsコンソール

Railsコンソールでユーザーを作成します。

// Railsコンソール
bin/rails c

// ユーザーを追加する
user = User.new(name: '名前', email: 'info@example.com',password: 'パスワード', password_confirmation:'パスワード', admin: true)

// 保存
user.save

// コンソールの終了
exit

4. テストする

http://localhost:3000/loginにアクセスして試すだけです。

参考文献

現場で使える Ruby on Rails 5速習実践ガイド





関連記事



公開日:2019年11月01日 最終更新日:2019年12月02日
記事NO:02800