0
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?

More than 1 year has passed since last update.

deviseでログイン後のリダイレクトを設定したらヘルパーメソッドのundefinedエラーが発生

Last updated at Posted at 2023-05-04

railsのdeviseライブラリを使った認証機能実装の練習をしていたところ、ヘルパーメソッド周りでどハマりしてしまい午前中を軽率に溶かしてしまったので、もし私と同じようなハマり方をしている方がいたら参考というか時短の助けにはなるかもと久々にQiitaに記録している次第です。

知っていればあまりに単純な見落としすぎるのですが、気づかないときは永遠にさまよい続けるものなので・・・。

初心者ゆえ、内容に大なり小なり事実誤認の可能性があることをご了承頂いた上で、お気づきの点などございましたらご教授いただけますと大変ありがたいです。

deviseのログイン機能実装

deviseの導入にあたっては定石通り、deviseをインストールしてビュワーやコントローラーを生成して行きました。

gemファイルに以下を追加

gem 'devise’

gemを反映させるためにbundle install

bundle install

deviseをインストール

rails g devise:install

userモデルを生成

rails g devise user

データベースをマイグレート

rails db:migrate

viewファイルを生成

rails g devise:views users

コントローラを生成

rails g devise:controllers users

initializer/devise.rbファイルの247行目付近で以下のコメントアウトを有効化(ビューファイルの変更を反映させるため)

config.scoped_views = true

その他もろもろ、細かな変更などしつつ、設定を反映させるために再度bundle installを実行し、rails sでサーバー立ち上げ。

ここまでが完了すると、views/users/sessions/new.html.erbがルーティングされている「/users/sign_in」にブラウザでアクセスすると以下のような画面を表示することができます。超おなじみの展開。

そして、ここからリダイレクト先を設定していきます。ログイン実行時後のリダイレクト先を指定するためには、application_controllerに以下のようなコードを書きます。

application_controller.rb
class ApplicationController < ActionController::Base

  def after_sign_in_path_for(resource)
    user_path(resource)
  end

end

resourcesのヘルパーメソッドを使うことで、railsで定義されている7つのアクションに対してのURLの指定が、「_path」といったヘルパーメソッドを使用して行えるんですね。

「after_sign_in_path_for(resource)」は、deviseにてあらかじめ定義されているアクションで、ログイン後のリダイレクト先を指定することができるものとなっています。

発生したエラー

さて、ここまで設定したら問題なく動くはずと思っていたら、以下のようなエラーに見舞われました。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333037333837372f33313831343037612d633631352d653962332d313235662d3230643630633461656338642e706e67.png

user_pathメソッドが未定義だ、と怒られているわけです。

formの設定を確認したり、コントローラを確認したり、gemファイルまで確認したりしたのですが、結局原因がわからず。しかし実はあまりにも初歩的なところに見落としがありました。

ルーティングの設定

私は絶対に見落としてはいけないポイントを見落としていたのですが、deviseを実行しただけでは、ルーティングは以下のような状態になっています。

routes.rb

Rails.application.routes.draw do

  devise_for :users

end

お気づきかと思いますが、ヘルパーメソッドの根拠となるresourcesについて何も書かれていないのです。

書かれているに決まっていると何故か思い込んでいた私は、これに気づくまでに何時間もかかってしまったのでした、、、情けない、、、

解決策は言わずもがな、resourcesを書くだけ。

routes.rb

Rails.application.routes.draw do

  devise_for :users
  resources :users

end

これだけでエラーは解消したのでした。

deviseはresourcesを自動で設定しない

こんなの当たり前なのかもしれないのですが、deviseがあまりにも便利なので、ついついresourcesの記述もあるような錯覚に陥っていました。

ヘルパーメソッドの根拠となるresourcesが定義されてない時は、こういうエラーが出るのだと知れたので、今後は一瞬で対応できるかと思います。

以上、もし万が一私と同じような詰み方をしている人がいたら、参考になるかも知れない駄文でした。

ーーーーーー

追記:

ユーザー登録時のリダイレクト先変更には、また別の注意点あり

0
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
0
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?