Railsでdeviseを導入してユーザー管理機能を実装する

#deviseを導入しユーザー管理機能を簡単に実装する
Railsで、gemのdeviseを使ってユーザー管理機能を実装する方法をまとめました。

##deviseの導入
まずはgemfileにdeviseを追加します。

```ruby:gemfile
gem 'devise'
```

bundle installを実行し、**サーバーを再起動します。**

そして、deviseの設定ファイルを作ります。

```
$ rails g devise:install
```

userモデルを作ります。

```
rails g devise user
```

この時、userモデルができると同時にマイグレーションファイルが生成されるので、追加するカラムがある場合は記述してからマイグレートしましょう。

```ruby:○○_devise_create_users.rb
--省略--
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :nickname,           null: false, default: ""
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :family_name,        null: false, default: ""
      t.string :first_name,         null: false, default: ""
      t.string :read_family,        null: false, default: ""
      t.string :read_first,         null: false, default: ""
      t.date :birth,                null: false
--省略--
```

emailとpasswordはデフォルトでついているはずなので、今回はそれ以外のカラムを追加するように作成しました。

余談ですが、生年月日のカラムを用意する際はdate型を使いますが、デフォルト値を定数以外で設定できないので、今回はデフォルトを設定していません。

準備ができたらマイグレートします。

```
$ rails db:migrate
```

あとはビューファイルを用意すれば準備は完了です。

##サインアップの実装

userがサインアップする際にemailとpassword以外の情報を登録するには、application_controllerに記述が必要です。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate_user!, except: [:index]
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :family_name, :email, :first_name, :read_family, :read_first, :birth])
  end
end
```

indexページにいる時以外に遷移している場合はログインページに無理やり飛ばせるように
before_action :authenticate_user!メソッドを記述しました。

追加のパラメーターを登録するのに
before_action :configure_permitted_parametersメソッドを記述します。

また、ビューファイルのform_withメソッドにもしっかりとモデルのインスタンス変数とパスを渡してあげましょう。

```ruby:views/devise/registrations/new.html.erb
---省略---
<%= form_with class: 'registration-main', model: @user, url: user_registration_path,  local: true do |f| %>
---省略---
```

```ruby:views/devise/sessions/new.html.erb
---省略---
<%= form_with class: 'registration-main',model: @user, url: user_session_path, local: true do |f| %>
---省略---
```

これがないと、userテーブルと連携が取れずに、うまく機能しません。


##ログアウトの実装
こちらは、ビューファイルにlink_toメソッドでログアウトボタンを実装してあげましょう。
ポイントは、usersessionを切るためのパスを忘れずに記述することです。

```ruby:xxx.html.erb
<li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %></li>
```

##ログイン時とゲスト時で表記を変える方法
ログインしているときはページにマイページに遷移するボタンと、ログアウトするボタンが表示されて、
ログインしていない時（ゲスト時）には新規登録ボタンとログインボタンが表示されるようにする記述についてもまとめておきます。

ヘルパーメソッドのuser_signed_in?メソッドを利用しましょう。
該当のビューファイルに次のような記述をします。

```ruby:views/xxx.html.erb
<% if user_signed_in? %>
          <li><%= link_to current_user.nickname, root_path, class: "user-nickname" %></li>
          <li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %></li>
      <% else %>
          <li><%= link_to 'ログイン', new_user_session_path, class: "login" %></li>
          <li><%= link_to '新規登録', new_user_registration_path, class: "sign-up" %></li>
      <% end %>
```