【Ruby on Rails】deviseを使ってログイン機能を実装　（新規登録時に名前を入力できるようにする）

##実装の流れ（まとめ）
1, deviceを導入

2, deviseの設定ファイルを作成

3, deviseの機能を持ったUserモデルを作成

4, マイグレーションファイルにnameカラムを追加する記述

5, 作成されたマイグレーションファイルを実行

6, devise用のビューを作成

7, 新規登録画面で名前を入力できるようにフォーム欄を追加

8, ストロングパラメーターを追加

9, 未ログイン時・ログイン時でボタンの表示を変更

10, 完了


詳細を以下に記載します。




##1,  deviceを導入
gemファイルの一番下に以下を記述します。


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

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


deviseを使用するためには、Gemのインストールに加えてdevise専用のコマンドを利用して設定ファイルを作成する必要があります。
ターミナルにて以下を実行します。


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

実行後以下のファイルが作成されます。
config/initializers/devise.rb
config/locales/devise.en.yml               


##3,  deviseの機能を持ったUserモデルを作成

作成には通常のモデルの作成方法ではなく、deviseのモデルの作成用コマンドでUserモデルを作成します。
ターミナルにて以下を実行します。

```ruby:ターミナル
$ rails g devise user
```

実行後以下のファイルが作成されます。
app/models/user.rb
db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
test/fixtures/users.yml
test/models/user_test.rb

またconfig/routes.rbに以下の様な記述が自動的に追記されることで、ログイン・新規登録で必要なルーティングが生成されます。

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :users
#以下略
```

##4,  マイグレーションファイルにnameカラムを追加する記述

t.string :name, null: false
を追記します。

```ruby:db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
#ここから追記します
      t.string :name,               null: false
#ここまで追記します
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
#以下略
```

##5,  作成されたマイグレーションファイルを実行


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

##6, devise用のビューを作成
deviseのコマンドを利用してビューファイルを生成すると、簡単に新規登録画面とログイン画面を作成できます。

```ruby:ターミナル
$ rails g devise:views
```


##7, 新規登録画面で名前を入力できるようにフォーム欄を追加
新規登録画面を編集して名前を入力できるようにフォーム欄を追記します。

```ruby:app/views/devise/registrations/new.html.haml 
%h2 Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
  = render "devise/shared/error_messages", resource: resource
#ここから追記します
  .field
    = f.label :name
    %br/
    = f.text_field :name
#ここまで追記します
  .field
    = f.label :email
    %br/
    = f.email_field :email, autofocus: true, autocomplete: "email"
  .field
    = f.label :password
    - if @minimum_password_length
      %em
        (#{@minimum_password_length} characters minimum)
    %br/
    = f.password_field :password, autocomplete: "new-password"
  .field
    = f.label :password_confirmation
    %br/
    = f.password_field :password_confirmation, autocomplete: "new-password"
  .actions
    = f.submit "Sign up"
= render "devise/shared/links"
```

##8, ストロングパラメーターを追加
名前が入力できるようになりましたが、このままでは名前はDBに保存されません。
何故ならdeviseでは初期状態で新規登録時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターが設定してあるからです。
そこで　configure_permitted_parametersメソッド　を利用します。
このメソッドはdeviseのストロングパラメーターを追加できるメソッドです。

application_controllerに以下を追記します。



```ruby:controllers/application_controller
class ApplicationController < ActionController::Base

  # ここから追記します
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) # 新規登録時(sign_up時)にnameというキーのパラメーターを追加で許可する
  end
  # ここまで追記します
end
```

##9, 未ログイン時・ログイン時でボタンの表示を変更
deviseでログイン機能を実装すると、user_signed_in?というメソッドを使用することができます。
これは、ユーザーがサインインしているかどうか検証するメソッドです。
サインインしている場合にはtrueを返し、サインインしていない場合にはfalseを返します。
ボタンを追加したい任意のファイルに以下を記述します。

```ruby:
- if user_signed_in?
  = link_to "新規投稿", new_post_path, class: "header__right--btn"
  = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn"
- else
  = link_to "ログイン", new_user_session_path, class: "header__right--btn"
  = link_to "新規登録", new_user_registration_path, class: "header__right--btn"
```

##10, 完了
あとはビューを整えれば完成です。