Deviseでパスワードの入力無しでユーザー情報の更新をする方法

こんにちは!kossyです!




本日のニュースはこちら
headlines.yahoo.co.jp

確かにポイントカードは持ち歩きも出し入れも煩わしいですね。

理想は、入店時にウェアラブルバイスをかざすと、
会計時にポイントが溜まるような世の中になったらいいなと思いますが、、、










さて、今回は、Railsの認証機能のgemで超有名なDeviseを使う際に、
パスワードの入力無しでユーザー情報の更新をする方法をブログに残してみたいと思います。






環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave





まずはDeviseのルーティングを修正

config/routes.rbを以下のように編集します。

Rails.application.routes.draw do
  devise_for :users,
    controllers: { registrations: 'registrations' }
end

Devise配下のコントローラなんだな、とコードを見て一目でわかるように、
改行を入れています。



registrations_controller.rbの作成

次に、app/controllers配下にregistrations_controller.rbを作成し、

class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
end

上記のコードを記述します。
受けとったリソースを、update_without_current_passwordメソッド(Userモデルに後で実装します)で
パスワード抜きで更新できるようにし、引数にparamsを指定してリソースの中身を更新しています。



update_without_current_passwordをUserモデルに定義

app/models/user.rbに下記のコードを追記してください

def update_without_current_password(params, *options)
    params.delete(:current_password)

    if params[:password].blank? && params[:password_confirmation].blank?
      params.delete(:password)
      params.delete(:password_confirmation)
    end

    result = update_attributes(params, *options)
    clean_up_passwords
    result
  end


params.delete(:current_password) で current_password のパラメータを削除。
if params[:password].blank? && params[:password_confirmation].blank? の行は、
パスワード変更のためのパスワード入力フィールドとその確認フィールドの両者とも空の場合のみ、
パスワードなしで更新できるようにするためです。
引用元:
Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可 | EasyRamble



これで思った通りの動きをするはずです。





参考にさせていただいた記事
Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可 | EasyRamble
Rails: deviseでユーザ編集画面のパスワード入力を任意にする - Qiita
deviseで現在のパスワード無しでuserを更新する - komagataのブログ