86日目
今日の学習
devise
アカウント情報を変更後のリダイレクト先を指定
【Rails/devise】アカウント情報編集機能の実装/リダイレクト先の変更手順 - Qiita Deviseをカスタマイズして、アカウントを編集した後のリダイレクト先を変更する@TECH CAMP #24|とだ|note
devise
でプロフィールを編集して保存すると、rootパスにリダイレクトされる。
保存後、ユーザー自身のマイページを表示したいため、リダイレクト先を変更する。
まず、以下のコマンドでdeviseのコントローラを作成する。
rails g devise:controllers users
上記のコマンドで作成された下記のファイルに、リダイレクト先を指定する。
app/controllers/users/registrations_controller.rb
protected # アカウント編集後のリダイレクト先 def after_update_path_for(resource) リダイレクト先のパス end
リダイレクト先のパスの部分には、自分の場合今回はuser_path(resource)
とすることでユーザー自身のページに移動する。
アカウント登録後のリダイレクト先を変更したい場合は以下のようなメソッドを使う。
def after_sign_up_path_for(resource) リダイレクト先のパス end
devise controllerを使うために、ルーティングを設定し、どのコントローラを参照するのかを明示する。
routes.rb
devisefor :users, controllers: { registrations: "users/registrations" }
パスワードを入力せずに情報を更新できるようにする
初期設定では、アカウントを編集し保存する時に現在のパスワードを要求される。
不便なため、パスワードを入力しなくても変更が保存できるようにする。
devise ユーザーのプロフィール画面作成と編集(デフォルトをカスタマイズ) - Qiita
先ほどと同じファイルに、以下のようなメソッドを書き込む。
app/controllers/users/registrations_controller.rb
protected def update_resource(resource, params) resource.update_without_password(params) end
書き込んだ後は、ビューファイルで現在のパスワードを入力する欄を削除すればOK。
...と思いきや。この状態では、名前やメールアドレスといった項目はパスワードなしで保存できるのだが、パスワードが変更できない。
どうやらupdate_without_password
を使うと、パスワードなしで更新できるがパスワード自体の更新ができなくなってしまうようだ。
Ruby - [Rails] Deviseでパスワードが変更できない|teratail
そのため、パスワードも更新できるようにするために変更を加える必要がある。
Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可 | EasyRamble
deviseのパスワード更新が出来ない | 株式会社ドリル|ホームページのアクセス解析・データ分析で目標達成のお手伝いいたします
update_without_password
メソッドはdevise
が用意してくれているメソッドだが、このメソッドの中でparams
から:password
、:password_confirmation
がdelete
されてしまっているため保存できないようだ。
update_without_current_password
というメソッドを新たに作成し、パスワードを保存できるようにする。
app/models/user.rb
def update_without_current_password(params, *options) if params[:password].blank? && params[:password_confirmation].blank? params.delete(:password) params.delete(:password_confirmation) end result = update(params, *options) clean_up_passwords result end
これでパスワードも無事保存できるようになった。