[devise]パスワード入力不要のユーザー編集

## deviseを使用したユーザー情報の編集で、バスワード入力を省略する

手順 ３つ
1. deviseコントローラファイルの作成（routes.rbの編集）
2. registrations_controller.rbの編集
3. edit.html.erbの編集

### 1.deviseコントローラファイルの作成（routes.rbの編集）
deviseのコントローラを編集するため、以下を行ってください。

```:ターミナル

$ rails g devise:controllers users

①コマンド実行で作成されるファイル
Running via Spring preloader in process *****
      create  app/controllers/users/confirmations_controller.rb
      create  app/controllers/users/passwords_controller.rb
      create  app/controllers/users/registrations_controller.rb
      create  app/controllers/users/sessions_controller.rb
      create  app/controllers/users/unlocks_controller.rb
      create  app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================

②追加でroutes.rbに以下のような記述が必要なことをお知らせしてくれている
Some setup you must do manually if you haven't yet:

  Ensure you have overridden routes for generated controllers in your routes.rb.
  For example:

　　　　　　　⬇︎  追記内容　⬇︎
    Rails.application.routes.draw do
      devise_for :users, controllers: {
        sessions: 'users/sessions'
      }
    end

===============================================================================
補足） このコマンドを実行しない限り中身をみることはできませんが、ユーザー登録時やサインイン時などは上記のコントローラで処理をしています。
```

上記の指示に習って、routes.rbを編集します。

```ruby:config/routes.rb
# before
Rails.application.routes.draw do
  devise_for :users

# after
Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: "users/registrations",
  }

# 今回は”編集”に関することなので、registrations_controllerのみ記述しています。
```

### 2. registrations_controller.rbの編集
パスワードなしで編集できるように登録（編集）時に処理を行うコントローラの記述を変更します。ファイル下部の`protected` のコメントアウトを外したうえで、その下に`update_resourceメソッド`を追記してください。

```ruby:registrations_controller.rb
  # コメントアウト外す
  protected

  #必須  更新（編集の反映）時にパスワード入力を省く
  def update_resource(resource, params)
    resource.update_without_password(params)
  end

  #任意  更新後のパスを指定
  def after_update_path_for(resource)
    user_path(@user.id)
  end
```
これで更新時にパスワードを入力しなくてもよくなりました。
ただ編集画面にパスワードの入力欄が残ったままなので、もう少し変更を加えます。


### 3. edit.html.erbの編集
最後に編集画面からパスワード入力欄をなくします。
まずはdeviseのビューを編集できるようにするため、以下を行ってください。

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

Running via Spring preloader in process *****
      ==== 必要な部分以外省略 ====
      create    app/views/devise/registrations/edit.html.erb

```
続いてビューからパスワード欄の記述を削除します。

```ruby:devise/registrations/edit.html.erb
  # 以下の記述を削除
  <div class="field">
    <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
    <% if @minimum_password_length %>
      <br />
      <em><%= @minimum_password_length %> characters minimum</em>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
    <%= f.password_field :current_password, autocomplete: "current-password" %>
  </div>
```

以上で変更作業は終了です。
最後に動作確認を行いましょう。

## 動作確認
今回は変更後の様子を分かりやすくするため、更新後に遷移する詳細ページのビューを以下のようにしています。ユーザー情報に`nickname`も追加しています。
##### 事前に登録した内容
nickname: sample
email: sample@sample
pasword: ******

##### ユーザー詳細ページ
<img src="https://i.gyazo.com/080dc6d80d2ea7e63556f94135175315.png" alt="Image from Gyazo" width="385"/>
---
登録編集画面は以下のようになっています。

##### ユーザー登録編集ページ
<img src="https://i.gyazo.com/a195b770e6d0b52705caa6e80f068f39.png" alt="Image from Gyazo" width="327"/>

---
パスワードの入力欄がすべてなくなっていますね。
それではユーザー情報を更新してみましょう。
nicknameを`テストユーザー`に変更し、`update`ボタンを押します。
すると、、、

##### 変更内容
nickname: **sample** => **テストユーザー**

##### ユーザー詳細ページ（更新後）
<img src="https://i.gyazo.com/52fcabc3d7c8446788be789d497ca8c2.png" alt="Image from Gyazo" width="439"/>

---
名前が `sample` から `テストユーザー` に変わりましたね。
以上で終了となります。お疲れ様でした。
また最後までお読みいただきありがとうございました。


## 補足
補足１）**3. edit.html.erbの編集**で任意事項（**更新後にユーザー詳細ページへ遷移する**）を記述した方は、変数`@user`を使用するため、usersコントローラのshowアクションで以下のように定義しておく必要があります。

```ruby:controllers/users_controller.rb
  def show
      @user = User.find(params[:id])
  end
```

補足２）ユーザー詳細ページのコードは以下の通りです。同じshowアクションを使い、リンクによってマイページと他ユーザーのページが切り替わるようにしてあります。

```ruby:users/show.html.erb
#マイページの記述
<% if params[:id].nil? || @user.id == current_user.id %>
  <h1>ようこそ<%= current_user.nickname %>さん</h1>
  ここはusers#showページです。
  <p>名前：<%= current_user.nickname %></p>
  <p>登録email：<%= current_user.email %></p>
  <br>
  アカウントを編集しますか？
  <%= link_to "はい", edit_user_registration_path %>
  <br>
  ログアウトしますか？
  <%= link_to "はい", destroy_user_session_path, method: :delete %>
#他ユーザーページ記述
<% else %>
  <h2>ここは<%= @user.nickname %>さんのページです</h2>
  <p>名前：<%= @user.nickname %></p>
  <p>登録email：<%= @user.email %></p>
<% end %>

```