【Rails / devise】ユーザー編集機能の実装（「現在のパスワード入力」の設定を無くす方法）

## 初めに

##### このような方におすすめの記事です
・devise　ユーザー編集の方法を知りたい
・デフォルトの「現在のパスワード」を入力せずにデータをアップデートしたい

## 前提

・deviseを導入済（インストール〜モデル作成まで）
・編集機能のレイアウトを作成済


以下の記事を参考に導入しています。

<a href="https://qiita.com/machamp/items/f6a7b003fcda3f04094a">[Devise] パスワードを入力せずにユーザー情報を編集する</a>
<a href="https://kossy-web-engineer.hatenablog.com/entry/2018/11/06/102047">Deviseでパスワードの入力無しでユーザー情報の更新をする方法</a>


## 手順

#### ①deviseのコントローラーを作成する

ターミナル
```
rails generate devise:controllers users
```

#### ②作成された以下のファイルに追記する

```app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
 #省略
end
```



#### ③コントローラーに編集したデータをアップデートする時に保存を許可するカラムを追加する

```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: [:name, :image, :profile])
    # 編集したデータをアップデートする時に保存を許可するカラムを追加する
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :image, :profile])
  end
end

```
### ④current_passwordフォームを削除する

```
<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>
```


## うまくいかなかった記述

今回手順②で以下の記述を

```app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
 #省略
end
```


↓「current」がない記述にすると、変更したいパスワードを入力しても保存されなくなってしまいました。

```app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

 def update_resource(resource, params)
    resource.update_without_password(params)  #こちらにcurrentの記述がない
  end
 #省略
end
```

今回は「現在のパスワードのみ」を無くしたかったので、currentの記述を追加したことで正常にデータをアップデート（保存）できるようになりました。
自分の用途に合わせて使用していきたいと思います。


## 参考：最終的なビュー

【新規登録】【編集】deviseが初期から保存するもの以外では以下のカラムを追加しています。
・image（CarrierWave使用）
　→設定を別に追加することなく、今回の方法で画像も編集できました
・name
・profile（自己紹介）

```app/views/devise/registrations/edit.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
 <%= render 'shared/error_messages', model: f.object %> 

  <div class="field">
    <%= f.label :email, "メールアドレス" %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>

 <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
 <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
 <% end %>

    <div class="field">
       <%= f.label :image, "プロフィール画像" %><br/>
       <%= f.file_field :image %>
    </div>

    <div class="field">
       <%= f.label :name, "ユーザー名（10文字以内）" %>
       <%= f.text_field :name %>
    </div>

     <div class="field">
        <%= f.label :profile, "プロフィール"%><br />
        <%= f.text_area :profile, class: :form__text, id:"user_profile"%>
    </div>

     <div class="login__attention">
       <span>●</span>変更のために現在のパスワードをご入力ください
       <br />
       <span>●</span>パスワードを変更される場合は新しいパスワードをご入力ください
       <br />
    </div>

    <div class="field">
         <div class="field__flex">
         <%= f.label :password, "パスワード（英数字6文字以上）" %>
          <div class="need">必須</div><br />
          </div>
           <%= f.password_field :password, autocomplete: "new-password" %>
   </div>

         <div class="field">
            <div class="field__flex">
            <%= f.label :password_confirmation, "パスワード再入力" %>
            <div class="need">必須</div><br />

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

            <div class="actions">
              <%= f.submit "変更する", class: :form__btn %>
            </div>
          <% end %>
```



## まとめ


最後までご覧くださり、ありがとうございました。
初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事が誰かのお役に立てれば幸いです。