deviseを使ってユーザー管理機能を実装

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

```ruby:Gemfile
gem 'devise'
```
```ruby:ターミナル
# Gemをインストール
% bundle install
```
Gemをインストールした後はrails sをcontrol + Cで一度停止し、サーバーを再起動する必要があります。
これは、インストールしたGemの反映するタイミングが、サーバー起動時だからです。

##deviseの設定ファイルを作成
deviseを使用するためには、Gemのインストールに加え、 devise専用のコマンドで設定ファイルを作成する必要があります。
###rails g devise:installコマンド
このコマンドは、追加したdeviseというGemの「設定関連に使用するファイル」を自動で生成するコマンドです。
現時点では、deviseを追加したら、最初に1度実行しておく程度の認識で問題ありません。

```ruby:ターミナル
% rails g devise:install
```

##deviseのUserモデルを作成
作成には通常のモデルの作成方法ではなく、deviseのモデル作成用コマンドでUserモデルを作成します。

###rails g deviseコマンド
ユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理します。
実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加されます。

```ruby:ターミナル
# deviseコマンドでUserモデルを作成
% rails g devise user
```
##テーブルを作成
rails g devise userコマンドで作成されたマイグレーションファイルは以下のように作成されています。

```ruby: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: ""

     ## 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
```
テーブルの設計が完了したら、マイグレーションを実行します。

```ruby:ターミナル
% rails db:migrate
```

##deviseのビュー作成
###rails g devise:viewsコマンド
deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置してくれるコマンドです。
HTMLを修正できるため、カスタマイズ可能になります。
deviseのコマンドで、devise用のビューファイルを生成します。

```ruby:ターミナル
% rails g devise:views
```
上記のコマンドで以下のビューファイルが作成されます。
サインアップ画面はapp/views/devise/registrations/new.html.erb、ログイン画面のビューはapp/views/devise/sessions/new.html.erbというビューファイルが対応しています。
好みのビューにカスタマイズができます。

#サインアップ時の名前登録
###usersテーブルにカラムを追加する場合
###rails g migrationコマンド
マイグレーションを生成するコマンドです。
マイグレーションはこれまで、rails g modelコマンドでモデルと一緒に生成されていましたが、すでに作成されたテーブルの内容を変更する際などに使用します。

<font color="Red">rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型</font>とすることで、テーブルにカラムを追加する際に必要なコードが記述された状態で、マイグレーションが生成されます。
例としてカラム名nicknameを追加する場合

```ruby:ターミナル
# usersテーブルにnicknameカラムをstring型で追加するマイグレーションファイルを作成
% rails g migration AddNicknameToUsers nickname:string

# 作成したマイグレーションを実行
% rails db:migrate
```

##ストロングパラメーター設定
###devise_parameter_sanitizerメソッド
deviseにおけるparamsのようなメソッドでdeviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストからパラメーターを取得できます。

```ruby: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
```
:devise_controller?というdeviseのヘルパーメソッド名を指定して、もしdeviseに関するコントローラーの処理であれば、そのときだけconfigure_permitted_parametersメソッドを実行するように設定しています。他のtweetsコントローラーなどでは処理は読み込まれても、実行まではされません。

その他ログインの有無でビューを変更するなど書き換えたら、
ユーザー管理機能の基本は終了です。

以上備忘録でした。