【Rails】deviseにおけるユーザー情報の編集・更新のやり方(パスワード不要)

この記事ではdeviseを用いたユーザー管理機能において、**パスワード不要**で
ユーザー情報を編集・更新する方法をアウトプットしていきます。

【前提】
・Rubyバージョン2.6.5
・Railsバージョン6.0.0
・gem 'devise'によるユーザー管理機能を作成済み。
・ユーザーのマイページを作成済み。

【この記事の構成】
①ルーティングを設定
②registrations_controller.rbを作成
③registrations_controller.rbを編集
④user.rbを編集
⑤application_controller.rbを編集
⑥editビューを編集

#①ルーティングを設定する
まずは`registrations_controller.rb`を使えるようにルーティングを変更します。

```routes.rb
Rails.application.routes.draw do

 devise_for :users, controllers: {
   registrations: "users/registrations"
 }
 
 end
```
※参照した記事には`sessions: "users/sessions"`の記述もありましたが、
 自分はこれを加えるとログアウトの際にsessionに関するエラーが出ました。
　（sessionの設定だけして、関連するファイルを作成していなかったためと思われる）

#②registrations_controller.rbを作成する
次にコントローラーの編集です。
`app/controllers/users/registrations_controller.rb`となるように
ファイルを作成します。

**手動で作成できます↓**
1.controllersディレクトリ下に、usersフォルダを作る。
2.usersフォルダ内に`registrations_controller.rb`ファイルを作成する。

#③registrations_controller.rbを編集する
deviseで実装されている`update_without_password`は、パスワードを入力せずに更新ができるメソッドです。

```app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  protected

  # パスワードなしで更新できるメソッド
  def update_resource(resource, params)
    resource.update_without_password(params)
  end

  # 編集後のリダイレクト先を指定するメソッド
  def after_update_path_for(resource)
    user_path(resource)
  end
end
```
※リダイレクト先のパスを user_path(resource) とすると、登録後にユーザーの個人ページ、つまり「マイページ」のようなページにリダイレクトされるようになります。

#④user.rbを編集する

```user.rb
validates :password, presence: true, on: :create
```

devise機能を使うと、デフォルトでpasswordにバリデーションがかかっています。
このままだとそのデフォルト機能が編集の情報入力にも適用されるので、createアクションのみにバリデーションが動作するよう設定します。

#⑤application_controller.rbを編集する

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :config_permitted_parameters, if: :devise_controller?
private
  def config_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    # この一行を追加↓
    devise_parameter_sanitizer.permit(:account_update, keys: [:image, :name, :text])
  end
end
```
パラメータを受け取る際は、コントローラーにストロングパラメーターを記述しますが、
deviseの処理を行うコントローラーはGem内に記述されているため、直接編集することができません。

そこで使うのが、`application_controller`です。
前提条件の時点で、すでに`sign_up`に関する処理の記述はあると思うので
その下に`account_update`の記述を加え、欲しい値を受け取れるようにします。

#⑥editビューを編集する

あとは編集画面のビューを編集するだけです。

```
% rails g devise:views
```
上記のコマンドを実行すると、`app/views/devise/registrations/edit.html.erb`が作成されます。
ファイルを開くとデフォルトのコードが書かれているのが分かります。

**このときform_forに関する記述はそのまま使い、中身だけ書き換えましょう。**

```app/views/devise/registrations/edit.html.erb
# これはそのまま使えます。
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
```
あとはいつも通りブロック変数`f`を使って、必要なフォームを作成していきます。
ステップ③でリダイレクト先は指定しておいたので、`f.submit`を押せばマイページへと戻ります。
<br>
以上でパスワード不要のdeviseユーザー編集・更新機能の実装は完了です！お疲れ様でした。
ご指摘などあれば、ご教授いただけると幸いです。

**参考にした記事**
[【devise】パスワード入力無しのユーザー情報編集機能の実装](https://kyoro1210.hatenablog.com/entry/2020/10/23/094309)
[Deviseをカスタマイズして、アカウントを編集した後のリダイレクト先を変更する](https://note.com/ruquia7/n/n4838547cb054)
[devise ユーザーのプロフィール画面作成と編集（デフォルトをカスタマイズ）](https://qiita.com/akr03xxx/items/82ba45f7ef4fdbd5c702)
[【Rails】deviseでユーザー編集機能を現在のパスワードなしで更新してみる。](https://note.com/ya_jp/n/n5b565cd7ec93)