Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可

Devise のデフォルトのユーザーのアカウント情報変更画面(users#edit)では、ログイン済みのユーザーが自分のアカウント情報を変更するために、現在のパスワードを入力するのが必須となっています。これをパスワードなしで自分のアカウント情報を更新できるように変更します。

— 環境 —
rails 5.0.0.1
devise 4.2

【追記 2016/11/08】
Rails 5 + Devise 4 の環境での検証を行いました。また、当初の Devise::RegistrationsController#update をオーバーライドする方法よりも、Devise::RegistrationsController#update_resource をオーバーライドする方法のほうが簡単なので、それについて追記しました。
【追記ここまで】

— 記事初回公開時の環境 —
rails-4.0.1
devise-3.2.2

スポンサーリンク

Devise::RegistrationsController#update_resource をオーバーライド

Devise では Devise::RegistrationsController#update の中で、Devise::RegistrationsController#update_resource が呼び出されており、その実装はデフォルトでは以下のようになっています。

なので、カスタマイズしたコントローラー(例えば Users::RegistrationsController < Devise::RegistrationsController)で、以下のようにオーバーライドします。

update_without_password は Devise で実装されており、パスワードなしで更新を行うメソッドです。このようにすると、行数の少ないカスタマイズでパスワードなしでユーザーのアカウント情報を更新できるようになります。ただし、これだとパスワード自体を更新できません。

なので、パスワードなしで更新を可能にするロジックを自力で実装する場合は、以下のように書く。

update_without_current_password は自分で User モデル等に実装を行います。エントリー末尾で、パスワードなしでパスワード自体を更新できるようにする User#update_without_current_password の実装を紹介しています。

当初公開しました以下の方法でも可能ですが、上述で追記した update_resource をオーバーライドする方法のほうが簡単です。

Devise::RegistrationsController#update をオーバーライド

まず、devise-3.2.2/app/controllers/devise/registrations_controller.rb(class Devise::RegistrationsController < DeviseController)の update を、Devise カスタマイズ用の controller でオーバーライドします。 Rails で Devise のコントローラーをカスタマイズ | EasyRamble

app/controllers/users/registrations_controller.rb

Devise::RegistrationsController#update から丸コピペして持ってきたのをちょっとだけ変更。コメントアウトしてる行です。

と変更。update_without_current_password は自分で実装。current_password がなくても、ログイン済みのユーザーが resource (User モデルのインスタンス) を update できるようにします。

User モデルに update_without_current_password を実装

app/models/user.rb

params.delete(:current_password) で current_password のパラメータを削除。if params[:password].blank? && params[:password_confirmation].blank? の行は、パスワード変更のためのパスワード入力フィールドとその確認フィールドの両者とも空の場合のみ、パスワードなしで更新できるようにするためです。

ビューで current_password のフォーム要素を削除

current_password のフォーム要素を削除、または if false で囲み出力させないようにする。

app/views/users/registrations/edit.html.erb

以上で終了です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!