こんにちは、かつコーチです。
Railsを触り始めたばかりの頃は、見慣れないエラー画面に戸惑うことが多いですよね。
私自身も学習初期は、エラーメッセージを読まずにコードを闇雲に書き換えて時間を浪費していました。
この記事では、初心者が特につまずきやすい代表的なエラーを4つ取り上げます。
読み終える頃には、エラーメッセージを見て落ち着いて対処できるようになります。
エラーが起きたときの基本的な考え方
エラーメッセージは「敵」ではなく「ヒント」
Railsのエラー画面は、原因のクラス名と発生箇所を丁寧に教えてくれます。
慌てずに、エラーメッセージの1行目をまず読む癖をつけましょう。
多くの場合、そこに解決の糸口が書かれています。
エラークラス名で検索する
エラーメッセージの先頭にあるActionController::RoutingErrorのようなクラス名は、そのままGoogle検索のキーワードとして使えます。
日本語の解説記事や公式ガイドがヒットすることが多く、原因の特定が早まります。
よくあるつまずきポイント・エラー対処
Before/After:ActionController::RoutingError
ルーティングに存在しないURLへアクセスすると、このエラーが発生します。
❌Before:存在しないルートにアクセスした状態
ActionController::RoutingError (No route matches [GET] "/artcles")
articlesとタイプすべきところをartclesとタイプミスしていたことが原因でした。config/routes.rb側の定義は正しいのに、URLの入力ミスに気づかず10分ほど悩みました。
✅After:URLとルーティング定義を照合する
bin/rails routes | grep article
このコマンドで登録済みのルーティング一覧を確認し、正しいURLが/articlesであることに気づきました。
ブラウザのアドレスバーを直接タイプする際は、タイプミスがないか特に注意が必要です。
Before/After:ActiveRecord::PendingMigrationError
マイグレーションを実行し忘れたまま画面にアクセスすると発生するエラーです。
❌Before:マイグレーション未実行の状態
ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=development
新しいカラムを追加するマイグレーションファイルを作成した後、実行を忘れたままサーバーを再起動してしまいました。
✅After:エラーメッセージ通りにコマンドを実行する
bin/rails db:migrate RAILS_ENV=development
このエラーは、実は解決コマンドまでメッセージに書かれている親切なエラーです。
表示された指示をそのまま実行すれば、すぐに解決します。
Before/After:NoMethodError
存在しないメソッドを呼び出したときに発生する、初心者が最も遭遇しやすいエラーです。
❌Before:nilに対してメソッドを呼び出してしまう
user = User.find_by(email: "notfound@example.com")
puts user.name
NoMethodError (undefined method `name' for nil)
find_byは該当データがない場合nilを返すため、nil.nameを呼び出す形になりエラーになりました。
一次情報として、私はこのエラーを本番リリース直前のテスト中に発見し、冷や汗をかいた経験があります。
✅After:nilチェックを入れる
user = User.find_by(email: "notfound@example.com")
if user
puts user.name
else
puts "ユーザーが見つかりません"
end
find_byを使う場合は、結果がnilになる可能性を必ず考慮した書き方にします。
Before/After:uninitialized constant
クラス名のタイプミスやファイルの命名規則違反で発生するエラーです。
❌Before:クラス名とファイル名が一致していない
# app/models/article.rb
class Artcle < ApplicationRecord
end
NameError (uninitialized constant Article)
ファイル名はarticle.rbのままクラス名だけArtcleとタイプミスしてしまい、Railsの自動読み込みが機能しませんでした。
✅After:ファイル名とクラス名を一致させる
# app/models/article.rb
class Article < ApplicationRecord
end
Railsは「ファイル名からクラス名を推測する」仕組み(オートロード)で動いているため、両者を一致させることが必須です。
まとめ
この記事のポイント
- エラーメッセージの1行目とクラス名をまず読むことが、解決への近道
ActionController::RoutingErrorはURLとルーティング定義のズレが原因ActiveRecord::PendingMigrationErrorは指示通りマイグレーションを実行すれば解決NoMethodErrorはnilに対するメソッド呼び出しが典型パターンuninitialized constantはファイル名とクラス名の不一致が典型パターン
次に読むべき記事
マイグレーション関連のトラブルをさらに深掘りしたい方は「マイグレーションが失敗して困った話と対処法」も参考にしてください。rails consoleを使ったデバッグ方法を知りたい方は「rails consoleを使いこなすデバッグ術」も合わせてどうぞ。
タグ: Ruby on Rails, 初心者向け, エラー解決