Ruby on RailsでWebアプリケーションを開発する際、認証機能(ログイン、サインアップなど)の実装は避けて通れない課題の一つです。
数ある選択肢の中でも、Devise
Gem はRailsコミュニティにおける認証ソリューションのデファクトスタンダードとして広く採用されており、その導入は開発効率を大幅に向上させます。
第1回となる今回は、Devise Gemのインストール、devise:install
ジェネレータを使った基本的な初期設定、そして認証の主体となるUserモデルの準備までをゴールとします。
この記事を読めば、あなたのRailsアプリケーションにDeviseを導入するための最初のステップを確実に踏み出すことができます。
Deviseとは? なぜ広く使われるのか?
Devise
は、Railsエンジンとして実装された認証機能のフルスタックソリューションです。
MVCアーキテクチャに基づいたコンポーネント群を提供し、一般的な認証要件の多くをカバーしています。Deviseが選ばれる主な理由は以下の通りです。
豊富な機能を提供するモジュール群
Deviseの機能は、責務ごとに独立したモジュールに分割されています。開発者は、アプリケーションに必要な機能に応じて、これらのモジュールを選択的にモデルに include
して利用できます。
以下は、Deviseが提供する主要なモジュールとその機能です。
モジュール名 | 主な機能 |
---|---|
database_authenticatable | DB上のパスワードハッシュを用いた認証(最も基本的な認証) |
registerable | ユーザー登録(サインアップ、アカウント作成)処理 |
recoverable | パスワードリセット機能(トークン発行とメール通知) |
rememberable | “Remember me” 機能(Cookieによる自動ログイン) |
validatable | Email/パスワードの基本的なバリデーションを提供 |
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:views
やrails 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追加とインストール
まず、Devise
Gemを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.rb
で root
が定義されている必要があります。
もしまだ設定されていない場合は、アプリケーションのトップページに対応するコントローラーとアクションを指定します。
a. トップページ用コントローラーの準備 (もし未作成の場合)
例として、HomeController
の index
アクションをトップページとする場合の手順です。
bin/rails g controller Home index --skip-routes
これにより、app/controllers/home_controller.rb
と app/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.rb
に root
を設定します。
# 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ヘルパーメソッドについても解説する予定です。