deviseのユーザー管理機能実装中によくあるエラー

何回かdeviseを利用しユーザー管理機能を実装しているのですが、何回か遭遇したエラーについて残しておきます。

ActionController::RoutingError (No route matches [POST] "/users/sign_up”

画像がなくて申し訳ないのですが、このエラーは"/users/sign_up”のPOSTについてルーティングが存在しません、と言われています。

エラーが起きてしまった原因

何度かdeviseを使用しユーザー管理機能を実装していたため、以前の実装の記憶を頼りにルーティングを確認せずキーボードを叩いていました。
その時に記述していたのが以下のコードです。

<%= form_with model: @user, url: new_user_registration_path, class: 'registration-main', local: true do |f| %>

フォームに入力されたデータはuserテーブルに保存(POST)する、と言う記述ですが、ルーティングの部分であるurl: new_user_registration_pathに注目すると、明らかに間違っています。

解決した方法

rails routesコマンドをターミナルで実行すると以下のパスを出力してくれます。

deviseルーティング

よくよく見るとnew_user_registrationはGETに対するパスであり、user_registrationがPOSTに対するパスであることがわかります。
以下のコードに変更すると無事にフォームに入力されたデータがuserテーブルに保存されました。

<%= form_with model: @user, url: user_registration_path, class: 'registration-main', local: true do |f| %>

まとめ

ルーティングの記述をする際には、多分こうだろうで記述せず'rails routes'コマンドを実行し、確実なルーティングのパスをチェックする 使用したいHTTPメソッドもしっかり確認する

自分の記憶だけを頼りに作成していると、思い込みの部分で思わぬエラーが起きることがあるので、理解している部分についても確実に確認できる点に関しては面倒くさがらずにコマンド実行したり手順を確認し、より確実なものにしていくことでスムーズな開発に繋がっていくのだと実感しました。