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

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

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

# 1. devise導入手順まとめ
### ① deviseのインストール
　Gemfileの最下部にdeviseを記述する。

```ruby:Gemfile
gem 'devise'
```
　次に、ターミナルでbundle installを実行する。

```
% bundle install
```
　ここでGemのインストールを反映するために、ローカルサーバーを再起動すること。

### ② deviseの設定ファイル作成
　rails g devise:installコマンドを実行し、devise Gemの設定関連に使用するファイルを自動で生成する。

```
% rails g devise:install
```

### ③ deviseのUserモデル作成
　rails g deviseコマンドを実行し、ユーザー管理機能のモデルとマイグレーションの生成、ルーティングの設定をまとめて行う。
　<font color="Red">※通常のモデル作成方法と異なる点に注意。</font>

```
% rails g devise user
```

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

```ruby: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にそれぞれ対応。

### ⑥ [補足]コントローラーについて
　<font color="Red">deviseの処理を行うコントローラーはGem内に記述されているため編集ができない。</font>従い、必要な処理（ストロングパラメーターなど）は全てのコントローラーの継承元であるapplicationコントローラーに追記すること。

# 2. deviseメソッドまとめ
　deviseが提供するメソッドのうち、よく使うもの。これらを用いてユーザー管理機能を実装していく。

| メソッド             | 説明                                            | 
| ------------------ | ----------------------------------------------- |
| devise_for         | ユーザー機能に必要なルーティングを一度に生成する        |
| devise_parameter_sanitizer | ログインや新規登録などのリクエストからパラメーターを取得する
| user_signed_in?    | ユーザーがログイン状態かどうかを判定する               | 
| current_user       | 現在ログインしているユーザーの情報を取得する            | 
| authenticate_user! | ユーザーがログインしていなければ、ログイン画面に遷移させる | 

### ① devise_for
　**ユーザー機能に必要なルーティングをまとめて生成する。**rails g deviseコマンド実行時に下記のように自動記述される。
 
```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :users
end
```
### ② devise_parameter_sanitizer
　deviseにおけるparamsのようなメソッドで、**ストロングパラメーターの設定に用いる。**permitメソッドを組み合わせることで、deviseに定義されているストロングパラメーターに対して、追加したいカラムも指定して含めることもできる。<font color="Red">なお、上述の通り、applicationコントローラーに記述すること。</font>

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

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