記事の概要
- devise gemによるユーザー管理機能の導入手順をまとめました。
- ユーザー管理機能を実装するためのdeviseメソッドをまとめました。
deviseとは?
ユーザー管理機能を簡単に実装するためのGemです。
1. devise導入手順まとめ
① deviseのインストール
Gemfileの最下部にdeviseを記述する。
gem 'devise'
次に、ターミナルでbundle installを実行する。
% bundle install
ここでGemのインストールを反映するために、ローカルサーバーを再起動すること。
② deviseの設定ファイル作成
rails g devise:installコマンドを実行し、devise Gemの設定関連に使用するファイルを自動で生成する。
% rails g devise:install
③ deviseのUserモデル作成
rails g deviseコマンドを実行し、ユーザー管理機能のモデルとマイグレーションの生成、ルーティングの設定をまとめて行う。
※通常のモデル作成方法と異なる点に注意。
% rails g devise user
④ ユーザーテーブル作成
先ほど自動生成されたマイグレーションファイルを確認し、必要に応じてファイルに追記し、テーブル設計を反映させる。メールアドレスとパスワードのカラムはデフォルトで記述されている。
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :nickname, null: false # 左記のように必要に応じてカラム追加
# 省略
end
# 省略
end
end
テーブル設計を確認後、マイグレーションを実行。
% rails db:migrate
テーブル情報を変更したので、ここでローカルサーバーを再起動すること。
⑤ deviseのビューファイル作成
rails g devise:viewsコマンドを実行し、deviseが元々用意しているログイン/サインアップ画面のビューファイルを生成する。
% rails g devise:views
サインアップ画面はapp/views/devise/registrations/new.html.erb、ログイン画面のビューはapp/views/devise/sessions/new.html.erbにそれぞれ対応。
⑥ [補足]コントローラーについて
deviseの処理を行うコントローラーはGem内に記述されているため編集ができない。従い、必要な処理(ストロングパラメーターなど)は全てのコントローラーの継承元であるapplicationコントローラーに追記すること。
2. deviseメソッドまとめ
deviseが提供するメソッドのうち、よく使うもの。これらを用いてユーザー管理機能を実装していく。
メソッド | 説明 |
---|---|
devise_for | ユーザー機能に必要なルーティングを一度に生成する |
devise_parameter_sanitizer | ログインや新規登録などのリクエストからパラメーターを取得する |
user_signed_in? | ユーザーがログイン状態かどうかを判定する |
current_user | 現在ログインしているユーザーの情報を取得する |
authenticate_user! | ユーザーがログインしていなければ、ログイン画面に遷移させる |
① devise_for
**ユーザー機能に必要なルーティングをまとめて生成する。**rails g deviseコマンド実行時に下記のように自動記述される。
Rails.application.routes.draw do
devise_for :users
end
② devise_parameter_sanitizer
deviseにおけるparamsのようなメソッドで、**ストロングパラメーターの設定に用いる。**permitメソッドを組み合わせることで、deviseに定義されているストロングパラメーターに対して、追加したいカラムも指定して含めることもできる。なお、上述の通り、applicationコントローラーに記述すること。
private
def configure_permitted_parameters # ※メソッド名は慣習なのでこの限りでない
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー名])
end
deviseの処理名には、sign_in, sign_up, account_updateを選択して指定する。
③ user_signed_in?
**ユーザーのログイン状態を判定する。**ユーザーがログイン状態であればtrueを、ログアウト状態であればfalseを返す。用途例として、下記のようにif文と組み合わせることで「ログイン」「ログアウト」「新規登録」などのリンクボタンの切り替え表示が実装できる。
<% if user_signed_in? %>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to "ログイン", new_user_session_path %>
<%= link_to "新規登録", new_user_registration_path %>
<% end %>
④ current_user
**現在ログインしているユーザーの情報を取得できる。**例えばログイン中のユーザーのidを取得したい場合、 current_user.id で取得できる。
⑤ authenticate_user!
**このメソッドが呼ばれた時点でユーザーがログインしていなければ、そのユーザーをログイン画面に遷移させる。**下記のようにbefore_actionで呼び出すことで、特定のアクションを実行する前にログインしていなければ、ログイン画面に強制遷移させることができる。
class XxxController < ApplicationController
before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]
end