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

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

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 の機能全体を網羅されています。
 
スポンサーリンク
  • 2件のコメント
  • もってぃ

    参考になりました!
    うまく動作したので、一安心です。

    ありがとうございます!

    • taka

      もってぃさん、こんばんは。ご報告ありがとうございます。うまく動いて良かったです!
      Devise は最初はちょっと難しいですけど、コツつかんで慣れるととても便利です^^

Leave Your Message!