[Rails]deviseを使ってユーザ管理をしよう

#はじめに

ご意見、ご要望があれば是非コメントください！
また、こうしてほしい！やこれ教えて！といったリクエストについてもお待ちしております！

#deviseとは
######
deviseとは、ユーザ管理機能（例：ログイン、ログアウト、新規登録）を簡単に実装できてしまうgemのことです。

#前提条件
######
・基本的なrailsの仕組みを理解していること
・本記事では導入から簡単な仕組み説明をいたします

#さっそく導入してみよう

まずは、gemをインストールします。

```:Gemfile
gem 'devise'
```

このとき、deviceとしないように注意してください、私はしました(笑)
では、以下のコマンドを打ってください。使用するアプリディレクトリでおこなってください

```
bundle install
```

このあと、一旦rails sでサーバを起動させましょう


#deviseの設定ファイルを作成

以下のコマンドを打ってください。
これはdeviseに関する設定ファイルを自動生成してくれるコマンドになります。

```
rails g devise:install
```

これで一旦、事前準備は終了です。

#Userモデルの作成をする

######
ここからモデルを作成していきましょう
今回は、ユーザ管理を行うためのモデルをUserとします。
通常であれば、

```
rails g model user
```
としますが、deviseの場合は以下のようにします

```
rails g devise user
```
rails g deviseコマンドという、モデルとマイグレーションの作成やルーティング設定をまとめてしてくれます。


```config/routes.rb
Rails.application.routes.draw do
  devise_for :users #追加された部分
  root to: 'tweets#index'
  resources :tweets

end
```
devise_forはメソッドの1つで、ユーザ管理機能における複数のルーティングを一気に作ってくれます。
ただこの段階では、当然モデルを作成してませんので、rails sしてもエラーが出ます


さて、先ほど作成したモデルのマイグレーションファイルを見てみましょう

```db/migrate/20XXXXXXXXX_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 :name, null:false #自分で追加したカラム


     ## Recoverable
     t.string   :reset_password_token
     t.datetime :reset_password_sent_at

     ## Rememberable
     t.datetime :remember_created_at

     # 省略

     t.timestamps null: false
   end

   add_index :users, :email,                unique: true
   add_index :users, :reset_password_token, unique: true
   # add_index :users, :confirmation_token,   unique: true
   # add_index :users, :unlock_token,         unique: true
 end
end
```

うまくできていれば、こんな感じになっているかと思います。
デフォルトで既にカラムが設定されていますので
新たに欲しいカラムがあれば、自分で追加しておきましょう。（今回は7行目にnameカラムを追加しています）

#Viewを作成しよう
続いて、viewファイルを作ってみましょう。実はdeviseはもともと用意してくれてます。
以下のコマンドを打ってみてください。

```
rails g devise:views
```
このコマンドはapp/viewsにdeviseがもつデフォルトのviewファイルをコピーして配置してくれます。
例えば、
サインアップ画面→app/views/devise/registrations/new.html.erb
ログイン画面のビュー→app/views/devise/sessions/new.html.erb
というビューファイルが対応しています。

気になる方は実際に触ってみて確認してください。
変更を加えてみるのも面白いです！


#ところで、コントローラ設定は、、、！？

お気づきの方もいるかと思いますが、
コントローラーの設定をしてないですよね！？

実は、deviseのコントローラーはGemに記載されているので<font color="Red">編集ができません！！！！</font>

じゃあどうするのか、application_controller.rbを使用しましょう！！

#application_controller.rbからコントローラをいじる

上述したように、deviseのコントローラは直接編集できません。

そこでapplication_controller.rbを使用します。
application_controller.rbは言ってみればコントローラ界の王です。
すべてのコントローラがapplication_controller.rbを継承します。

例えば、ストロングパラメータの設定をしたい！！というときは以下のようにします。

```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
```
一個づつ説明します。
まずはメソッドについて。

```application_controller.rb

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
devise_parameter_sanitizerはdeviseにおけるparamsのようなメソッドです。
deviseのUserモデルに関する「ログイン」「新規登録」などのリクエストからパラメーターを取得できます。

記載の仕方は、

```
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
```
:deviseの処理名の一例は以下です。

|処理名 |役割  |
|---|---|
|:sign_in |ログイン処理  |
|:account_update |ユーザ情報更新  |

許可するキーは今回、デフォルト以外で設定したnameキーを指定しています。



deviseを使っているのでこういったメソッドを使用しますが、使っていなければ
params.require(:user).permit(:~,:~)とできますね。


続いて、before_actionについてですが、これを設定しておけば、各コントローラよりも先に指定のアクションを行ってくれます。

```application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
```
ただし、毎回全てのコントローラの前に、このbefore_actionを実行する必要はないので
if: :devise_controller?で、deviseのコントローラに対してのみ行うようにします。
なお、:devise_controller?はdeviseのヘルパーメソッドです。

#終わりに

以上、deviseの紹介についてでした。

deviseを導入すると今回紹介したこと以外にもcurrent_userが使えたりなど便利なものが多いので
是非調べて実践してみてください。

LGTMもお待ちしております！