プログラミング備忘録

プログラミングの学習状況をメモしています

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_confirmationdeleteされてしまっているため保存できないようだ。

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

これでパスワードも無事保存できるようになった。