Rails Devise入門ガイド(1): インストールから初期設定、Userモデル生成まで

Ruby on RailsでWebアプリケーションを開発する際、認証機能(ログイン、サインアップなど)の実装は避けて通れない課題の一つです。

数ある選択肢の中でも、Devise Gem はRailsコミュニティにおける認証ソリューションのデファクトスタンダードとして広く採用されており、その導入は開発効率を大幅に向上させます。

第1回となる今回は、Devise Gemのインストールdevise:install ジェネレータを使った基本的な初期設定、そして認証の主体となるUserモデルの準備までをゴールとします。
この記事を読めば、あなたのRailsアプリケーションにDeviseを導入するための最初のステップを確実に踏み出すことができます。

目次

Deviseとは? なぜ広く使われるのか?

Devise は、Railsエンジンとして実装された認証機能のフルスタックソリューションです。
MVCアーキテクチャに基づいたコンポーネント群を提供し、一般的な認証要件の多くをカバーしています。Deviseが選ばれる主な理由は以下の通りです。

豊富な機能を提供するモジュール群

Deviseの機能は、責務ごとに独立したモジュールに分割されています。開発者は、アプリケーションに必要な機能に応じて、これらのモジュールを選択的にモデルに include して利用できます。

以下は、Deviseが提供する主要なモジュールとその機能です。

モジュール名主な機能
database_authenticatableDB上のパスワードハッシュを用いた認証(最も基本的な認証)
registerable ユーザー登録(サインアップ、アカウント作成)処理
recoverable パスワードリセット機能(トークン発行とメール通知)
rememberable “Remember me” 機能(Cookieによる自動ログイン)
validatableEmail/パスワードの基本的なバリデーションを提供
confirmableメールアドレス確認機能(確認トークンとメール通知)
lockable ログイン試行の失敗回数に基づくアカウントロック機能
timeoutable 一定時間無操作の場合にセッションを自動的に失効させる機能
trackable サインイン回数、日時、IPアドレスなどのアクセス情報を記録する機能
omniauthable OmniAuthを利用した外部サービス認証連携(Google, Twitter, etc.)

(各モジュールの詳細は Devise公式ドキュメント を参照)

標準化されたインターフェースとヘルパー

Deviseは、認証に関連するコントローラー、ビュー、ルーティングを内部で提供します。
さらに、アプリケーション全体で利用できる便利なヘルパーメソッド(例: current_user でログイン中のユーザーを取得、user_signed_in?でログイン状態を確認)や、ルーティングヘルパー(例:new_user_session_pathでログインページのURLを取得)を提供し、一貫性のある開発をサポートします。

柔軟な設定と高い拡張性

広範な設定項目

config/initializers/devise.rbファイルを通じて、パスワードの最小文字数、アカウントロックの条件、セッションタイムアウトの時間など、Deviseの挙動を細かく設定できます。

カスタマイズ

rails g devise:viewsrails g devise:controllersコマンドで、Deviseが内部で使用するビューやコントローラーをアプリケーション内にコピー(eject)し、自由にカスタマイズすることが可能です。

拡張ポイント

認証失敗時の処理をカスタマイズするなど、様々な拡張ポイントが用意されており、独自の要件に対応できます。

豊富な実績とコミュニティ

長年にわたり多くのRailsプロジェクトで利用されてきた実績があり、非常に安定しています。
また、利用者が多いため、Web上には豊富な情報やチュートリアル、問題解決のヒントが存在します。

前提となる開発環境

この記事では、以下の2つの条件を満たすRails開発環境を前提として解説を進めます。

1. DockerおよびDocker Compose

アプリケーションとデータベースなどがコンテナとして管理されている環境。

2. Tablerレイアウト

Tabler UIキットが導入済みで、app/views/layouts/admin.html.erbのような管理画面用レイアウトが作成されていること。

Step 1: GemfileへのDevise追加とインストール

まず、DeviseGemをRailsアプリケーションに追加します。Gemfileを開き、以下の行を追加してください。

# Flexible authentication solution for Rails with Warden.[https://github.com/heartcombo/devise]
gem "devise"
# Translations for the devise gem[https://github.com/tigrish/devise-i18n]
gem "devise-i18n"

ファイルを保存したら、ターミナル(Docker環境の場合はRailsコンテナ内)で bundle install を実行し、Gemをインストールします。

bundle install

Deviseのメッセージを日本語化します。

rails g devise:i18n:locale ja

Step 2: devise:install による初期設定ファイルの生成

次に、Deviseの基本的な設定ファイル(initializer)を生成し、必要な初期設定の指示を確認します。以下のコマンドを実行してください。

bin/rails generate devise:install

このコマンドは、以下の2つの主要なアクションを実行します。

1. Initializerファイルの生成

config/initializers/devise.rb ファイルが作成されます。このファイルにはDeviseの様々な設定項目が含まれており、後でカスタマイズできます。

2. 設定指示の表示

ターミナルに、Deviseを正しく動作させるために必要な追加設定の手順が表示されます。

表示される設定指示の要約

===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
       
     * Not required *

===============================================================================

設定項目 1: Action Mailer の default_url_options 設定

Deviseは、パスワードリセットやメールアドレス確認などの機能でメールを送信します。
メール本文内に正しいURL(例: パスワード再設定ページのURL)を含めるためには、Action MailerがURLを生成する際のデフォルトホスト名とポート番号を知っている必要があります。

config/environments/development.rb ファイルを開き、config.action_mailer.default_url_options を設定します。

# config/environments/development.rb
Rails.application.configure do
  # ... (既存の設定) ...

  # Devise (および他のメーラー) がメール内で正しいURLを生成できるように設定
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  # host には開発環境でアクセスするホスト名、port にはポート番号を指定

  # ... (既存の設定) ...
end

本番環境 (Production) では、config/environments/production.rb に、実際のアプリケーションのドメイン名を :host として設定するのを忘れないでください。 (例: { host: 'www.myapp.com', protocol: 'https' })

設定項目 2: ルートパス (root) の設定

Deviseは、ユーザーがログインした後やログアウトした後などに、アプリケーションのルートパス (/) にリダイレクトすることがあります。そのため、config/routes.rbroot が定義されている必要があります。

もしまだ設定されていない場合は、アプリケーションのトップページに対応するコントローラーとアクションを指定します。

a. トップページ用コントローラーの準備 (もし未作成の場合)

例として、HomeControllerindex アクションをトップページとする場合の手順です。

bin/rails g controller Home index --skip-routes

これにより、app/controllers/home_controller.rbapp/views/home/index.html.erb が生成されます。

b. トップページビューの編集 (任意)

生成された app/views/home/index.html.erb を開き、動作確認用に簡単な内容を記述しておくと良いでしょう。

<h1>ようこそ MyApp へ!</h1>
<p>ここはアプリケーションのルートページです。</p>

<p><%= flash[:notice] %></p>

<% if defined?(user_signed_in?) %>
  <% if user_signed_in? %>
    <p>ログイン中: <%= current_user.email %></p>
    <%= button_to "ログアウト", destroy_user_session_path, method: :delete %>
  <% else %>
    <p>ログインしていません。</p>
    <p><%= link_to "ログイン", new_user_session_path %></p>
  <% end %>
<% end %>
<p><%= link_to "サインアップ", new_user_registration_path %></p>

c. ルートパスの設定

config/routes.rbroot を設定します。

# config/routes.rb
Rails.application.routes.draw do
  root to: "home#index"

  namespace :admin do
    root "dashboard#index"
  end

  # ... (他のルーティング) ...
end

設定項目 3: Flashメッセージの表示設定

Deviseは認証結果などを Flashメッセージ (notice または alert) で伝えます。これを管理画面に表示するため、まず表示ロジックをパーシャルファイルに分離し、それを管理画面レイアウトから呼び出します。

a. パーシャルファイルの作成

まず、Flashメッセージを表示するためのパーシャルファイルを作成します。
共通で使えるように app/views/admin/shared/_flash_messages.html.erb という名前でファイルを作成します。

<% flash.each do |key, value| %>
  <%# Deviseのキー (:notice, :alert) をTablerのアラートタイプ (success, danger) に変換 %>
  <% type = case key.to_sym
            when :notice then "success" # 緑色のアラート
            when :alert  then "danger"  # 赤色のアラート
            else key.to_s              # その他のキーはそのままクラス名として使う (例: :info -> "info")
            end %>
  <%# Tabler のアラートコンポーネントを利用 %>
  <div class="alert alert-important alert-<%= type %> alert-dismissible" role="alert">
    <div><%= value %></div> <%# メッセージ本文 %>
    <%# 閉じるボタン %>
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  </div>
<% end %>

b. レイアウトファイルからの呼び出し

次に、管理画面用のレイアウトファイル (app/views/layouts/admin.html.erb など) の、メッセージを表示したい場所(例: ページ本体コンテンツの直前)に以下の render コードを追加します。パスが shared ディレクトリを指すようにします。

<%# app/views/layouts/admin.html.erb の <div class="page-body"> や <div class="container-xl"> の内側など、表示したい場所に追加 %>

<%= render "admin/shared/flash_messages" %>

この入門記事(第1回)では、Devise コントローラーのカスタマイズまでは扱いません。

設定項目 4: Deviseビューのカスタマイズ (任意)

rails g devise:views コマンドについては、後の回で扱います。現時点では実行不要です。

Step 3: 認証モデル (User) の生成と設定

次に、Deviseを使って認証を行う対象となるモデル(通常は User モデル)を作成します。以下のコマンドをRailsコンテナ内で実行します。

bin/rails g devise User

このコマンドは、主に以下のファイルを生成・変更します。

1.モデルファイル (app/models/user.rb)

devise メソッド呼び出しを追加し、デフォルトモジュールを include します。

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
2. マイグレーションファイル (db/migrate/..._devise_create_users.rb)

users テーブルを作成するためのマイグレーションファイルを生成します。
このマイグレーションファイルには、Deviseが選択されたモジュール(上記のデフォルトモジュール)で必要とするカラム(例: email, encrypted_password, reset_password_token など)の定義が含まれます。

3. ルーティングの追加 (config/routes.rb)

devise_for :users という行を config/routes.rb に追加します。これにより、ログイン (/users/sign_in)、ログアウト (/users/sign_out)、サインアップ (/users/sign_up) など、Deviseが提供する認証関連のルーティングが一括で定義されます。

Rails.application.routes.draw do
  namespace :admin do
    root "dashboard#index"
  end

  scope "/admin" do
    devise_for :users, path: ""
  end
end
scope '/admin'

このブロック内のルーティングパスの先頭に /admin を付与します。

devise_for :users, path: ”, path_names: {…}
path: ”

devise_for が通常パスに追加するモデル名 (users) を削除します。
これにより、/admin/users/sign_in ではなく /admin/sign_in のようなURLになります。

path_names: {…}

各アクションに対応するパス名を変更したい場合に指定します。ここで指定した名前が path: '' と組み合わされて最終的なURLが /admin/login などになります。

Step 4: データベースマイグレーションの実行

Step 3で生成されたマイグレーションファイルを実行し、データベースに users テーブルを作成します。

bin/rails db:migrate

Step 5: 基本的な動作確認

ここまでの設定が正しく行われたかを確認しましょう。

1. 開発サーバー (Railsコンテナ) を起動または再起動します。
docker compose up -d
2. ブラウザでアクセスします。

Webブラウザを開き、/admin 配下に設定されたDeviseの認証関連パスにアクセスします。

  • ログインページ: http://localhost:3000/admin/users/sign_in (ポートが3000の場合)
  • サインアップページ: http://localhost:3000/admin/users/sign_up

アクセスすると、Deviseのデフォルトのログインフォームやサインアップフォームなどが表示されるはずです。

エラーなくページが表示され、URLが意図通り /admin/ から始まっていることを確認できればOKです。
フォームのカスタマイズは後の回で行います。

まとめと次回予告

今回は、Docker + Tabler環境のRailsアプリケーションに認証機能を導入するための第一歩として、Devise Gemのインストールdevise:install による初期設定Userモデルとマイグレーションファイルの生成、そして認証関連URLをすべて /admin/sign_in 等の /admin 配下に統一し、データベースマイグレーションの実行までを行いました。

これにより、Deviseを利用するための基本的な環境が /admin ルート配下で整いました。

次回は、実際に /admin/sign_in 等のURLを使ってユーザー登録(サインアップ)ログイン(サインイン)ログアウト(サインアウト) を試し、コントローラーやビューで利用できる current_user などの便利なDeviseヘルパーメソッドについても解説する予定です。

未経験からエンジニアへ転職!おすすめの転職サービスはこちら

「未経験だけどエンジニアになりたい…」「IT業界に興味があるけど、どこから始めるべきかわからない…」
そんな方におすすめなのが、プログラミングスクールを活用した転職活動です。
実績豊富なスクールを利用すれば、未経験からでもエンジニアとしての転職がぐっと近づきます!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次