LoginSignup
1
1

More than 1 year has passed since last update.

[Rails] deviseによるユーザー管理機能の導入手順とメソッドまとめ [devise]

Last updated at Posted at 2021-05-02

記事の概要

  1. devise gemによるユーザー管理機能の導入手順をまとめました。
  2. ユーザー管理機能を実装するためのdeviseメソッドをまとめました。

deviseとは?

 ユーザー管理機能を簡単に実装するためのGemです。

1. devise導入手順まとめ

① deviseのインストール

 Gemfileの最下部にdeviseを記述する。

Gemfile
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

④ ユーザーテーブル作成

 先ほど自動生成されたマイグレーションファイルを確認し、必要に応じてファイルに追記し、テーブル設計を反映させる。メールアドレスとパスワードのカラムはデフォルトで記述されている。

db/migrate/XXXXXXXXX_devise_create_users.rb
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コマンド実行時に下記のように自動記述される。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users
end

② devise_parameter_sanitizer

 deviseにおけるparamsのようなメソッドで、ストロングパラメーターの設定に用いる。permitメソッドを組み合わせることで、deviseに定義されているストロングパラメーターに対して、追加したいカラムも指定して含めることもできる。なお、上述の通り、applicationコントローラーに記述すること。

application_controller.rb
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で呼び出すことで、特定のアクションを実行する前にログインしていなければ、ログイン画面に強制遷移させることができる。

xxx_controller.rb
class XxxController < ApplicationController
  before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]
end
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1