🐕

ユーザー管理機能のためのdevise導入手順

2022/02/28に公開

はじめに

deviseとは、ユーザー管理機能を簡単に実装するためのGemです。
実際に運用されているRailsアプリケーションサービスで使用されているそうです。

https://github.com/heartcombo/devise

本記事の目次は以下のとおりです。

  1. deviseのインストール
  2. Userモデルとテーブルの作成
  3. ビューファイルの作成
  4. ストロングパラメーターの設定(カラムを追加した場合)
  5. ログインの有無でビューの表示を変える場合

deviseのインストール

既存のrailsアプリににdeviseライブラリをインストールします。
Gemfileの最後の行に追記しましょう。

Gemfile
gem 'devise'

インストールするアプリのディレクトリで以下コマンドを実行します。

% bundle install

次に、devise専用のコマンドで設定ファイルを作成します。

% rails g devise:install

Userモデルとテーブルの作成

ユーザー情報を管理するためのUserモデルを新しく作成する必要がありますが、rails g model userではなく、deviseのモデル作成用コマンドで作成します。
ターミナルで以下を実行しましょう。

% rails g devise user

実行すると、モデル・マイグレーションも自動生成されます。
さらに、ルーティングも自動生成されていますので確認しましょう。

config/routes.rb
Rails.application.routes.draw do
+ devise_for :users
  root to: 'homes#index'
  resources :homes
end

このとき、追記されたdevise_for :usersの位置はこのまま最上位にしておく必要があります。
また、このdevise_forは、ユーザー機能に必要な複数のルーティングを一度に生成してくれています。

次に自動生成されたマイグレーションファイルを確認します。

db/migrate/20XXXXXXXXX_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""

    # 省略

    end
  end
end

上記の通り、メールアドレスとパスワードについては初期状態で既に記述済みです。
ちなみに、ビューで自身が入力するときはpasswordpassword_confirmationというキーを使用しますが、データベースに保存される前に、deviseが2つの情報を照合します。また、一致していればパスワードそのものを暗号化してくれる仕組みになっています。
その暗号化された後のパスワードがencrypted_passwordです。

メールアドレスとパスワード以外のカラムの追加をする場合は、ここで追加しても良いし、後から追加してもどちらでも大丈夫です。
ここではこのままテーブルを作成します。

% rails db:migrate

これでusersテーブルが作成されました。

ビューファイルの作成

deviseを使用してログイン機能を実装すると、自動的にログイン画面とサインアップ(新規登録)画面が生成されます。
しかし、ビューファイルとしては生成されていませんので、deviseのコマンドを使用してビューファイルを生成します。

% rails g devise:views

app/viewsの配下にdeviseディレクトリが生成されました。

必要に応じて、デフォルトのビューを変更・差し替えします。
ファイル名や配置するディレクトリ名は変更しないよう注意しましょう。

デフォルトのログインの画面
デフォルトのログインの画面

ストロングパラメーターの設定(カラムを追加した場合)

deviseを使わない通常のリクエストは、コントローラーにストロングパラメーターを記述します。

しかし、deviseの処理を行うコントローラーはGem内に記述されており、編集することができません。
そこで、すべてのコントローラーが継承しているapplication_controller.rbファイルにdeviseに関するストロングパラメーターを定義します。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end

上記コードの説明

  • 2行目before_action :configure_permitted_parameters, if: :devise_controller?
    before_actionifオプションを設定することで、if以下の戻り値がtrueであったときのみ、処理が執行されます。
    :devise_controller?というdeviseのヘルパーメソッドを指定し、deviseに関するコントローラーの処理であれば、configure_permitted_parametersメソッドを実行するようにします。

  • 6行目devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
    devise_parameter_sanitizeメソッドをプライベートメソッドの中で定義しました。
    deviseの提供元でこのとおり紹介されていることから、慣習的にこのメソッド名で定義することが多いようです。

ここで引数に注目しましょう。

# paramsのpermitメソッド
params.require(:モデル名).permit(:許可するキー)

# devise_parameter_sanitizerのpermitメソッド
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
  • 第一引数の処理名にはsign_insign_upaccount_updateが使用でき、それぞれサインイン時やサインアップ時、アカウント情報更新時の処理に対応しています。
  • 第二引数には初期から設定されているメールアドレスとパスワード以外に設定したカラムがあれば、そのkeyの取得を許可します。

ログインの有無でビューの表示を変える場合

deviseを導入しているため、user_signed_in?メソッドが使用できます。
このメソッドは、ユーザーがログイン状態であればtrueを、ログアウト状態であればfalseを返します。

これでログイン状態とログアウト状態で表示されるビューを切り替えることができるようになりました。

app/views/layouts/application.html.erb
# 省略
<% if user_signed_in? %>
  <div class="user_nav grid-6">
    <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
    <%= link_to "投稿する", new_tweet_path, class: "post" %>
  </div>
<% else %>
  <div class="grid-6">
    <%= link_to "ログイン", new_user_session_path, class: "post" %>
    <%= link_to "新規登録", new_user_registration_path, class: "post" %>
  </div>
<% end %>
# 省略

Discussion