プログラミング学習

Rubyやrailsについて学んだことをアウトプットしています。

【Rails エラー】No route matchesの原因と解決方法

今回もオリジナルアプリを開発している過程でエラーに遭遇しました。
このエラーはSessionモデルを使用してログイン機能を実装している過程で発生しました。
今回はこのエラーの原因と対処法、それに関連したルーティングに関して考えていきます! f:id:yusuke_learning:20211026184659p:plain

・エラーコードから原因を読み解く

・ルーティングについて


・エラーコードから原因を読み解く


今回のエラーコードについて読み解いていきます。
まず、エラーの発生はログイン機能においてメールアドレスとパスワードを入力し、ログインボタンを押したときに発生しました。f:id:yusuke_learning:20211026185237p:plain

以下のエラーコードによるとRoutingに関して問題が発生していることがわかります。
さらに詳しく見ると
・POSTメソッドで/session/newに該当するルーティングが見つからない。
ことが原因であることがわかります。
よって、今回のエラーはRoutingに関する記載があるroutes.rbファイルと原因となるリクエストを送信したログインページを見れば解決できると考えられます。 f:id:yusuke_learning:20211026184659p:plain

・該当箇所を確認する f:id:yusuke_learning:20211026190537p:plain 該当箇所のログインページを見ていきます。
ここではメールアドレスとパスワードを入力することでsessionコントローラーのcreateアクションに遷移するように設定されています。
コードを見たところ特に問題はなさそうに思えます。
次にroutes.rbのファイルを確認しましょう。
f:id:yusuke_learning:20211026185745p:plain routes.rbではsession#createに繋がるアクションは"/login"に繋がれていました。ルーティングの方でURL先を変更していたのにログインフォームで変更を加えていなかったことがルーティングエラー発生の原因でした。
そこでログインフォームを以下のように変更します。

<%= form_with  url: login_url, scope: :session, local: true do |f| %>

これによってurl先は/loginにしてすることができました。
この状態でログインを行うと f:id:yusuke_learning:20211026191846p:plain 今度は別のエラーが発生してしまいました…
しかし、URLの部分を見てみると
f:id:yusuke_learning:20211026191928p:plain "/login"となっており指定したかったURL先に変更しています。エラーの内容も変わったことから先ほどのエラーはとりあえず解決できたと考えられます。

そこで今回のエラーコードを読み解いてみると Sessionコントローラーが単数形で登録されているが複数形ではないか?といった内容でした。
ここでもう一度routes.rbを確認してみると
f:id:yusuke_learning:20211026192154p:plain "session#create"の部分が単数形になってしまっていました! この部分を修正すると無事にログインアクションが行えました!

・エラーコードから原因を読み解く


最後に今回のエラーの原因となったルーティングについて学習しましょう。
ルーティングとはRailsアプリケーションのコントローラへ指示を出すための道筋のことでです。
その設定方法は基本的に以下の形になります。 f:id:yusuke_learning:20211026192824p:plain HTTPリクエストのメソッドを指定し、URL(パス)とコントローラー名#アクション名で定義します。
ルーティングファイルを確認するときにちゃんとこの基礎の形に沿っているかを確認することで今回のようなエラーを防ぐことができたと思います!

同じエラーを起こさないように今後も頑張ります!!
参考資料:


Rails ルーティング 基礎 まとめ - Qiita