はじめに
今回は「パスワード忘れた方はこちら」から始まる各種設定を行っていきたいと思います。
devise
部分以外のgem
導入などは上記記事を参考に進めていきます
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
本題:devise
側での設定
参考記事の内容を一通り?完了させた後。
Devise
を使うとパスワードリセット機能は自動的に実装され、ルーティングもDevise
側で自動的に追加されるため、手動でのルーティング設定は不要です
👇ログイン画面等に実装されている「パスワードお忘れの方はこちら」ボタンを押すと初期状態では次のような画面が表示されます。
こちらのビューファイルはapp/views/devise/passwords/new.html.erb
になります。自身の好きなスタイルに変更すればビューファイルは完了です。
※<%= render "devise/shared/links" %>
部分について
- このコードはDeviseが提供する 共通リンク部分のテンプレート を表示し、「パスワードを忘れた場合」や「アカウント登録はこちら」などのリンクが含まれています。
-
app/views/devise/shared/_links.html.erb
ファイルを編集することでカスタマイズすることができます。
※フラッシュメッセージを実装したい(間違えた時)
パスワード再設定画面でメールアドレスを無事に送信できた時、自動でフラッシュメッセージを表示するようになっていますが、メールアドレスを間違えたり、メールアドレス無記入の時はフラッシュメッセージが表示されないと思います。
以下私が行った設定です
def create
self.resource = resource_class.send_reset_password_instructions(resource_params)
if successfully_sent?(resource)
redirect_to after_sending_reset_password_instructions_path_for(resource_name)
else
flash[:alert] = "メールアドレスを確認してください" if is_navigational_format?
render :new # もしくは、適切なテンプレートを表示
end
end
おそらく上記コードで設定できるかと。
※メール内容を英語表記から日本語表記へ
devise
の日本語設定実行済みの場合config/locales/devise.vieews.ja.yml
の内容を使用することができます
👇編集したファイルになります。
<p><%= t('.greeting', recipient: @resource.email) %></p>
<p><%= t('.instruction') %></p>
<p><%= link_to t('.action'), edit_password_url(@resource, reset_password_token: @token) %></p>
<p><%= t('.instruction_2') %></p>
<p><%= t('.instruction_3') %></p>
※パスワード変更のリンクを押した後のビューファイル編集
初期状態では下記のようになります(私は既に<%= render "devise/shared/links" %>
を編集してあるので少し異なっています)
app/views/devise/passwords/edit.html.erb
でほかのフォームと統一感をもつよう編集していきます。
※パスワード更新失敗した時、フラッシュメッセージ表示させたい
上記「パスワード再設定画面」にて不備があった時のフラッシュメッセージを表示させるためのメソッドを追記しましたが、今回も同様に追記が必要になります
今回は更新に該当します
def update
self.resource = resource_class.reset_password_by_token(resource_params)
# パスワード更新が成功した場合、ログインする
if resource.errors.empty?
flash[:success] = "パスワードが変更されました" if is_navigational_format?
sign_in(resource_name, resource) # 自動的にログインする場合
respond_with resource, location: after_sign_in_path_for(resource)
else
# 入力エラーの場合、エラーメッセージを設定
flash[:alert] = "パスワードを確認してください" if is_navigational_format?
respond_with resource
end
end
最後にまとめ
sorcery
の時とは異なり、ある程度のフォーマットが既に作成されているので、後は自分好みのスタイルに変更するだけ。非常に便利だと感じています。
フラッシュメッセージの表示には少し苦戦しましたが、普通のエラーメッセージと併せて表示させたいという方、今回の記事が何か参考になれば幸いです。