rails 'gem devise' 名前でログインする

#gem devise名前でログインする方法
__参考にさせていただきました__
>[@linkss [Devise.rb設定ファイル項目まとめ]][link-1]さん
[link-1]:https://qiita.com/linkss/items/9b005ebc2ef81a39afa2
>
[@matsubishi5 [【Rails】deviseを用いた名前ログイン機能の実装
]][link-2]さん
[link-2]:https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d
>
[@Orangina1050 [[初心者] deviseを使ってログイン機能を実装してみよう]][link-3]さん
[link-3]:https://qiita.com/Orangina1050/items/a16e655519a60f35b394

__ありがとうございます__

---
###アプリ作成

```:terminal
rails new hujityaku --skip-bundle
```

hujityaku(不時着)という名のアプリ作成

```:terminal
cd hujityaku
```

hujityakuディレクトリ移動

```:terminal
bundle install --path vendor/bundle
```

bundle installする

```:terminal
rails s
```

`rails s`で立ち上がればOK

##トップ画面作成

```:terminal
rails g controller home top
```

```routes.rb
Rails.application.routes.draw do
  root to: 'home#top'
end
```

```:home_controller.rb
class HomeController < ApplicationController
  def top
  end
end
```

_viewはそのままで行きます_

##gem devise導入

```:Gemfile
gem 'devise' < 追記 >
```

```:terminal
bundle install
```

```:terminal
rails g devise:install
```

```:terminal
rails g devise User name:string
```

>`rails g devise User name:string`の記述で、devise Userモデルにデフォルトであるemail, passwordなど以外に追加で`名前ログイン`するための`name`カラムを生成してくれる


```:terminal
rails db:migrate
```

```:terminal
rails g devise:controllers users
```

>これをきちんと指定しないと、のちに`routes`で失敗する。私自身、これにハマりました。

```:terminal
rails g devise:views users
```

##名前ログインのため編集もろもろ

```routes.rb
Rails.application.routes.draw do
  root to: 'home#top'

  devise_for :users, controllers: {
    sessions: 'users/sessions',
    registrations: 'users/registrations'
  }
end
```

>上記の様に記述する事でViewの変更が可能になる。
※ 「devise_for :users」のままでは、既存のViewが表示されてしまい、Viewの編集が効かなくなる。

```:users/registrations/new.html.erb
-------省略--------
------<追記>-------
<div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>

-----<ここまで>----

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
-------省略--------
```

---

```:users/sessions/new.html.erb
< 削除 >

<div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
```

_これを消して以下に変更_

```:users/sessions/new.html.erb
< 追記 >

<div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>
```

---
__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:[:email])
    end
end
```

>`devise_parameter_sanitizer.permit(:sign_up,keys:[:email])`とする理由は、
ユーザー認証時に使用するキーを

```config/initializers/devise.rb
#49行目をコメントアウトして[:name]に変更
config.authentication_keys = [:name]
```

>に変更したため新規登録時に`ユーザー認証時に使用するキー`がnameになる。
そのため、`(:sign_up,keys:[:email])`で新規登録時にemailというパラメーターを追加で許可するようにしていしなければならない。

_名前でログインする必要がなければ、必要ないが今回は、`名前ログイン`する方法なのでこのようにした_

あとは、`home#top`の記述を変更するだけでOK

```views/home/top/html.erb
<% if user_signed_in? %>
  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> 
<% else %>
  <%= link_to "ログイン", new_user_session_path, class: 'post' %>
  <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
<% end %>
```

以上です。間違いあれば教えてください。