【Rails】deviseを使って新規登録した後に「/users」へリダイレクトされる場合の対処法


こんにちは!
ねこじょーかー(@nekojoker1234)と申します。

Railsでログイン機能の実装といえば、deviseを使うと簡単ですよね。

以下はgithubからの抜粋ですが、diviseを使うだけで、こんなにもたくさんの機能を簡単に実装することが可能になります。

  • Database Authenticatable:パスワードをハッシュし、データベースに保存して、サインイン中のユーザーの信頼性を検証します。認証は、POST要求またはHTTP基本認証の両方で実行できます。
  • Omniauthable:OmniAuthサポートを追加します。
  • Confirmable:確認手順を記載したメールを送信し、サインイン時にアカウントが既に確認されているかどうかを確認します。
  • Recoverable:ユーザーのパスワードをリセットし、リセットの指示を送信します。
  • Registerable:登録プロセスを通じてユーザーのサインアップを処理し、ユーザーがアカウントを編集および破棄できるようにします。
  • Rememberable:保存されたCookieからユーザーを記憶するためのトークンの生成とクリアを管理します。
  • Trackable:サインイン数、タイムスタンプ、およびIPアドレスを追跡します。
  • Timeoutable:指定期間内にアクティブでなかったセッションを期限切れにします。
  • Validatable:電子メールとパスワードの検証を提供します。これはオプションであり、カスタマイズできるため、独自の検証を定義できます。
  • Lockable:指定された回数ログインに失敗すると、アカウントをロックします。電子メールを介して、または指定された期間後にロック解除できます。

この中のtrackablelockableを使用できるようにしたところ、新規登録した後に「/users」へリダイレクトされるようになってしまったので、解決方法も合わせて残しておきます。

trackableの解決方法

どうやらtrackableは、新規登録後にUserのサインイン数などをUpdateしているようなのです。

これだけだと「へーそうなんだ」と思うだけかもしれませんが、調べたらここに根本原因がありました。

ユーザー編集画面(/users/edit)で登録を完了すると、ユーザー詳細画面にリダイレクトするように、以下の処理を追加している人がほとんどではないでしょうか?

app/controllers/registrations_controller.rb
  def after_update_path_for(resource)
    user_path(resource)
  end

上記の処理が「新規登録後にも」動いているようで、このメソッドが悪さをしていました。
そこで、新規登録後には動かないように、以下の分岐処理を追加すると、問題なく動作するようになります。

app/controllers/registrations_controller.rb
  def after_update_path_for(resource)
    # trackableを有効にしていると、新規登録後に/usersへリダイレクトされてしまう
    # ユーザー編集画面からの更新時のみ、詳細画面へリダイレクトするよう条件を追加
    user_path(resource) if request.referer&.include?('/users/edit')
  end

lockableの解決方法

lockableの場合はtrackableの対処法ではダメで、新規登録後のパスを指定できるafter_sign_up_path_forを使用して、明示的にパスを指定することで解決しました。

app/controllers/registrations_controller.rb
  def after_sign_up_path_for(resource)
    # lockableを有効にしていると、新規登録後に/usersへリダイレクトされてしまうため、
    # 明示的にパスを指定する
    posts_path
  end

これらは調べた限りどこにも載っていなかったので、もしかしたら私の実装方法に問題があるのかもしれません。
しかし、同じことで悩んでいる人もいるかも?と思い記事にしてみました。

あわせて読みたい

HTMLもわからない初心者が、独学で「投稿型SNSサービス」を作ったって本当?【193日間の死闘】

運営している PlayFab 専用ブログ
https://playfab-master.com