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に以下のようなコードを書きます。
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にてあらかじめ定義されているアクションで、ログイン後のリダイレクト先を指定することができるものとなっています。
発生したエラー
さて、ここまで設定したら問題なく動くはずと思っていたら、以下のようなエラーに見舞われました。
user_pathメソッドが未定義だ、と怒られているわけです。
formの設定を確認したり、コントローラを確認したり、gemファイルまで確認したりしたのですが、結局原因がわからず。しかし実はあまりにも初歩的なところに見落としがありました。
ルーティングの設定
私は絶対に見落としてはいけないポイントを見落としていたのですが、deviseを実行しただけでは、ルーティングは以下のような状態になっています。
Rails.application.routes.draw do
devise_for :users
end
お気づきかと思いますが、ヘルパーメソッドの根拠となるresourcesについて何も書かれていないのです。
書かれているに決まっていると何故か思い込んでいた私は、これに気づくまでに何時間もかかってしまったのでした、、、情けない、、、
解決策は言わずもがな、resourcesを書くだけ。
Rails.application.routes.draw do
devise_for :users
resources :users
end
これだけでエラーは解消したのでした。
deviseはresourcesを自動で設定しない
こんなの当たり前なのかもしれないのですが、deviseがあまりにも便利なので、ついついresourcesの記述もあるような錯覚に陥っていました。
ヘルパーメソッドの根拠となるresourcesが定義されてない時は、こういうエラーが出るのだと知れたので、今後は一瞬で対応できるかと思います。
以上、もし万が一私と同じような詰み方をしている人がいたら、参考になるかも知れない駄文でした。
ーーーーーー
追記:
ユーザー登録時のリダイレクト先変更には、また別の注意点あり