プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】「devise」、「devise_invitable」につい…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】「devise」、「devise_invitable」について

01.06

  • miyabisan2
  • コメントを書く

この記事は5分で読めます

deviseとは?

Railsのgemの一つでログイン機能を簡単に実装してくれます。

インストール手順

Gemfileに下記の記述をする。

1
gem 'devise'

bundleインストールする。

1
bundle install

deviseの設定

deviseに関連するファイルをジェネレータで自動生成します。

1
rails g devise:install

deviseに関連するユーザーモデルを作成します。

1
rails g devise user

マイグレーションを実施します。

1
rails db:migrate

使い方

基本的にデフォルトの機能の利用範囲であれば、一度ログインしたらdeviseの認証画面はログアウトするまでは目にすることはありません。deviseのビューやコントローラの処理自体も目に見える場所には出てこないので、マイグレーションのDB周り以外はアプリとは独立しているイメージになります。(ただ、HTML等のビュー部分に関してはコマンドでアプリ内に組み込んでカスタマイズすることは可能です。)

サインアップ

Railsサーバーを起動して下記URLにアクセスするとユーザーのサインアップページができています。

1
http://localhost:3000/users/sign_up

なお、ログイン状態になっている場合は再度サインアップの画面にアクセスしたとしてもRailsアプリのrootに飛ばされます。

サインイン(ログイン画面)

下記URLはログインページになります。

1
http://localhost:3000/users/sign_in

なお、ログイン状態になっている場合は再度ログイン画面にアクセスしたとしてもRailsアプリのrootに飛ばされます。

サインアウト(ログアウト)

「/users/sign_out(destroy_user_session_path)」に対してHTTPのDELETEメソッドを実行することでログアウトさせることが可能になります。Railsのlink_toビューヘルパーを使ったサンプルは下記のようになります。

1
2
3
4
5
<%= link_to 'ログアウト',
  destroy_user_session_path,
  class: 'dropdown-item',
  method: :delete
%>

手軽にログアウト動作を確認したい場合

手軽にURLを叩いてログアウト処理を実施したい場合はGETでリクエストしてもログアウトが行われるように下記のようなルーティング設定を追加すると良いでしょう。

1
2
3
4
5
6
7
8
Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
 
  devise_scope :user do                  ★追加
    get '/users/sign_out' => 'devise/sessions#destroy'   ★追加
  end                                                      ★追加
end

試しに上記ルーティング設定を追加後に下記URLにアクセスすればサインアウトが行われます。

1
http://localhost:3000/users/sign_out

「ログイン画面」や「サインアップ画面」のデザインを変えたい場合

下記コマンドを実行してdeviseのビューファイルをRailsアプリ内に組み込みます。

1
rails g devise:views

ログイン画面なら下記HTMLになります。

1
views/devise/sessions/new.html.erb

サインアップ画面であれば下記HTMLになります。

1
views/devise/registrations/new.html.erb

ログイン、ログアウト後に遷移する画面設定

各コントローラの基底クラスである「ApplicationController」に対して下記のように設定します。

1
2
3
4
5
6
7
8
9
10
11
class ApplicationController < ActionController::Base
  # ログイン後に遷移するpathを設定
  def after_sign_in_path_for(resource)
    tool_index_path
  end
 
  # ログアウト後に遷移するpathを設定
  def after_sign_out_path_for(resource)
    tool_index_path
  end
end

deviseの機能

作成したdeviseのユーザーモデルを確認すると下記のようにシンボルがたくさんありUserモデルにて使用できる機能になります。

1
2
3
4
5
6
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end

デフォルト機能

Database Authenticatable

DBに保存されたパスワードが正しいか検証を行ってくれます。パスワードの暗号化も行ってくれます。実務でもほぼ間違いなく使われます。

Recoverable

パスワードをリセットしてくれます。実務でもたまに使われます。

以下のパスが自動で生成されます。

  • new_{モデル名}_password_path
  • edit_{モデル名}_password_path
  • {モデル名}_password_path

パスワードの再発行画面は下記です。サインアウトしている状態のみで使えます。

http://localhost:3000/users/password/new

パスワードを再発行すると下記のカラムに値が入ります。

  • reset_password_token
  • reset_password_sent_at

Registerable

Userの登録、削除、編集等を行ってくれます。実務でもたまに使われます。

設定すると以下のパスが自動で生成されます。

  • cancel_{モデル名}_registration_path
  • new_{モデル名}_registration_path
  • edit_{モデル名}_registration_path
  • {モデル名}_registration_path

Rememberable

20日間ログインしたままにするというような永続ログインを実現します。実務でもたまに使われます。

ログイン画面にある「Remember me」のチェックボックスをクリックした際の挙動です。

ログインすると下記のカラムに日付が入り計測されます。ログアウトするとカラム内容がnilになります。

  • remember_created_at

Validatable

バリデーション機能を提供してくれます。実務でもほぼ間違いなく使われます。

その他機能

Omniauthable

SNS認証を行うためのモジュールです。他にもGemが必要になります。

Confirmable

登録後メールを送りメールをクリックすると本登録させるという仕組みを実装してくれます。

Trackable

ログイン時間や回数等を保管しておき分析に役立てます。実務でもほぼ間違いなく使われます。

Timeoutable

ログインしたままのアカウントのセッションを破棄します。

Lockable

ログインに何度も失敗するとアカウントをロックさせる機能です。

マイグレーションファイル

「rails g devise user」によりデフォルトで作成されたマイグレーションファイルになります。上記で紹介したデフォルトで使う機能別(Database Authenticatable等)に必要なカラム名や設定等が記載されています。デフォルトでは使用されない機能はコメントアウトされているので使いたい場合はコメントを外してマイグレーションを実行する必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# frozen_string_literal: true
 
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
 
      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at
 
      ## Rememberable
      t.datetime :remember_created_at
 
      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip
 
      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable
 
      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at
 
 
      t.timestamps null: false
    end
 
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

現在ログイン中であるかの判定

現在ログイン中のユーザーは「current_user」というUserモデルの変数に値が入ることになります。ログイン中であれば下記のメソッドを使えばtrueが返り、ログアウト中であればfalseが返ります。

1
current_user.present?

一般ユーザーと管理者を分ける。

deviseのユーザーテーブルにadminという管理者を示すフラグを追加します。

1
rails g migration add_admin_to_users admin:boolean

生成されたマイグレーションファイルを実行します。

1
rails db:migrate

後はプログラム内で下記のような記述を実施すれば管理者特有の処理を実装可能です。

1
2
3
if current_user.try(:admin?)
  #ユーザーが管理者である場合に行わせたい処理
end

devise_invitableとは?

deviseに招待機能を追加します。

実装手順

Gemfileに下記を追加する。

1
gem 'devise_invitable'

インストール

1
bundle install

翻訳ファイルを作成する。

1
rails g devise_invitable:install

deviseと紐づいているモデルに「devise_invitable」用のカラムを追加する。

1
rails g devise_invitable User

追加されるカラム

カラム名 説明
invitation_token
invitation_created_at
invitation_sent_at
invitation_accepted_at
invitation_limit
invited_by_type
invited_by_id どのユーザーに招待されたかのIDが入る。
invitations_count 招待メールを送った人数が自動でカウントされる。

ビューを作成します。

1
rails g devise_invitable:views

なお、コントローラはデフォルトの処理から変えたい場合は「Devise::InvitationsController」を継承してメソッドをオーバーライドして作成するようにしましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Users::InvitationsController < Devise::InvitationsController
  def new
    super
  end
 
  def create
    super
  end
 
  def edit
    super
  end
 
  def update
    super
  end
 
  def destroy
    super
  end
end

ルーティング設定を追加

1
2
3
  devise_for :users, controllers: {
    invitations: 'users/invitations'
  }

また、「app/views/devise/mailer/invitation_instructions.html.erb」にある下記内容がメール送信内容になっています。

1
2
3
4
5
6
7
8
9
10
11
<p><%= t("devise.mailer.invitation_instructions.hello", email: @resource.email) %></p>
 
<p><%= t("devise.mailer.invitation_instructions.someone_invited_you", url: root_url) %></p>
 
<p><%= link_to t("devise.mailer.invitation_instructions.accept"), accept_invitation_url(@resource, invitation_token: @token) %></p>
 
<% if @resource.invitation_due_at %>
  <p><%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %></p>
<% end %>
 
<p><%= t("devise.mailer.invitation_instructions.ignore") %></p>

デフォルトで、「root_url」という構文を使っていて下記の設定をしないとエラーになるので注意しましょう。

config/environments/development.rb

1
config.action_mailer.default_url_options = { host: '任意のドメイン名' }

スポンサーリンク
  • 2020 01.06
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 12.04

    【Ruby on Rails】アセットの設定ファイル(assets.rb、config/environments)

  2. 2019 12.01

    【Ruby on Rails】URLの指定方法について(URLヘルパーメソッド等)

  3. 2020 03.28

    【Ruby on Rails】「Flashメッセージ」について

  4. 2019 11.27

    【Ruby on Rails】RailsにBootstrapを導入する。

  5. 2020 03.15

    【Ruby on Rails】「フィクスチャ」について

  6. 2020 03.22

    【Ruby on Rails】Active Recordの絞り込みメソッドまとめ

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【BootStrap】「ナビゲーションバー」、「ドロッ…

【Ruby on Rails】「cancancan」に…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー