はじめに
初めまして。現役看護師をしながら、エンジニア転職を目指しRuby on Railsを勉強しています。
アウトプットのために、Devise を使ったユーザー認証の実装方法を調べながら試してみたので、その手順をまとめました。
記事内容
- Devise のインストール方法
- ユーザー登録 & ログインの実装
- Devise のビューをカスタマイズ
-
before_action :authenticate_user!
で認証を保護
完成イメージ
-
/users/sign_up
→ ユーザー登録ページ -
/users/sign_in
→ ログインページ -
/users/sign_out
→ ログアウト(DELETE メソッドで実行)
Devise のインストール
① Gem を追加
Gemfile
に以下を追加し、bundle install
を実行
gem "devise"
bundle install
Devise のセットアップ
① Devise のセットアップコマンドを実行
rails g devise:install
実行すると、いくつかの設定項目が表示される。
② config/environments/development.rb
にメール送信の設定を追加
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
パスワードリセットなどのメールリンクが正しく動作するよようになる。
User モデルの作成
① User モデルを Devise で作成
rails g devise User
このコマンドで User
モデルが作成され、マイグレーションファイルも生成される。
② マイグレーションを実行
rails db:migrate
Devise のルーティングを確認
config/routes.rb
を確認すると、次のように devise_for :users
が追加されているはず。
Rails.application.routes.draw do
devise_for :users
root to: "home#index" # ホームページを設定
end
devise_for :users
だけで、ユーザー登録・ログイン・ログアウト・パスワードリセットなどのルートが自動で設定さるはず。
確認方法
rails routes | grep users
実行すると、以下のようなルートが表示される。
new_user_session GET /users/sign_in
user_session POST /users/sign_in
new_user_registration GET /users/sign_up
user_registration POST /users
/users/sign_up
で新規登録
/users/sign_in
でログイン
/users/sign_out
でログアウト(DELETE メソッドが必要)
ログイン必須のページを作成
ログインしていないユーザーを制限するには、before_action :authenticate_user!
を。
例えば、boards_controller.rb
を作成して、ログインしたユーザーのみが index
を見られるようにするには以下のような感じになるらしい。
class BoardsController < ApplicationController
before_action :authenticate_user! # ログインユーザーのみアクセス可能
def index
@boards = current_user.boards
end
end
これで未ログインのユーザーがアクセスすると、自動でログインページにリダイレクトされる。
Devise のビューをカスタマイズ
デフォルトの Sign Up
や Sign In
ページをカスタマイズしたい場合は、以下のコマンドを実行。
rails g devise:views
すると、app/views/devise/
以下に以下のようなフォルダが作成されます。
app/views/devise/
├── registrations/ # ユーザー登録関連
│ ├── new.html.erb # 新規登録ページ
│ ├── edit.html.erb # プロフィール編集ページ
├── sessions/ # ログイン関連
│ ├── new.html.erb # ログインページ
これでログイン画面をカスタマイズ可能に
動作確認
サーバーを起動
bin/rails server
ブラウザでアクセス
- http://localhost:3000/users/sign_up → 新規登録ページ
- http://localhost:3000/users/sign_in → ログインページ
ログイン後、トップページ (root_path
) にリダイレクトされるか確認を。
まとめ
rails g devise:install
で Devise をセットアップ
rails g devise User
で users
モデルを作成
rails db:migrate
でマイグレーションを適用
devise_for :users
でログイン・ログアウトのルートが自動生成
before_action :authenticate_user!
で未ログインユーザーを制限
rails g devise:views
で Sign Up / Sign In
ページをカスタマイズ
これで Rails に Devise を導入し、認証機能を実装されました。
疑問
「ログイン後に特定のページへリダイレクトしたい」
class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
boards_path # ログイン後にボード一覧ページへリダイレクト
end
end
「メール認証を追加したい」
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
これを db/migrate/xxxx_add_devise_to_users.rb
に追加し、rails db:migrate
を実行。
Devise は、Rails の認証機能を実装できる便利な Gem であることを知りました
カスタマイズ性が高いのが、とても素晴らしいと感じました。
引き続き、学習を続けます。