1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【学習】deviseと開発環境パスワードリセット機能実装+フラッシュメッセージ

Last updated at Posted at 2024-10-29

はじめに

今回は「パスワード忘れた方はこちら」から始まる各種設定を行っていきたいと思います。

devise部分以外のgem導入などは上記記事を参考に進めていきます

環境

  • Windows, WSL
  • Docker
  • Ruby 3.2.3
  • Rails 7.1.3

本題:devise側での設定

参考記事の内容を一通り?完了させた後。
Deviseを使うとパスワードリセット機能は自動的に実装され、ルーティングもDevise側で自動的に追加されるため、手動でのルーティング設定は不要です
👇ログイン画面等に実装されている「パスワードお忘れの方はこちら」ボタンを押すと初期状態では次のような画面が表示されます。
Image from Gyazo

こちらのビューファイルはapp/views/devise/passwords/new.html.erbになります。自身の好きなスタイルに変更すればビューファイルは完了です。

<%= render "devise/shared/links" %>部分について

  • このコードはDeviseが提供する 共通リンク部分のテンプレート を表示し、「パスワードを忘れた場合」や「アカウント登録はこちら」などのリンクが含まれています。
  • app/views/devise/shared/_links.html.erbファイルを編集することでカスタマイズすることができます。

※フラッシュメッセージを実装したい(間違えた時)

パスワード再設定画面でメールアドレスを無事に送信できた時、自動でフラッシュメッセージを表示するようになっていますが、メールアドレスを間違えたり、メールアドレス無記入の時はフラッシュメッセージが表示されないと思います。

以下私が行った設定です

app/controllers/users/passwords_controller.rb
  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の内容を使用することができます
👇編集したファイルになります。

app/views/devise/mailer/reset_password_instructions.html.erb
<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>

Image from Gyazo

※パスワード変更のリンクを押した後のビューファイル編集

初期状態では下記のようになります(私は既に<%= render "devise/shared/links" %>を編集してあるので少し異なっています)
app/views/devise/passwords/edit.html.erbでほかのフォームと統一感をもつよう編集していきます。
Image from Gyazo

※パスワード更新失敗した時、フラッシュメッセージ表示させたい

上記「パスワード再設定画面」にて不備があった時のフラッシュメッセージを表示させるためのメソッドを追記しましたが、今回も同様に追記が必要になります
今回は更新に該当します

app/controllers/users/passwords_controller.rb
  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の時とは異なり、ある程度のフォーマットが既に作成されているので、後は自分好みのスタイルに変更するだけ。非常に便利だと感じています。
フラッシュメッセージの表示には少し苦戦しましたが、普通のエラーメッセージと併せて表示させたいという方、今回の記事が何か参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?