この記事の対象
- Rails 7 + Docker で開発している方
- デバッグの進め方を整理したい初学者
環境
- macOS
- Rails 7.2.1
- slim記法
- Docker
概要
ここでは、自作アプリの削除機能が実行できなかったため、デバッグで解決を試みた例を紹介します。
発生した事象
- 画面上に削除ボタンを設置
- ボタンを押すと画面は更新されるが対象は削除されず
- サーバーログを見るとRoutingErrorが発生していた
デバッグ手順
- まずログを追う
次に、削除ボタンを押すとログが流れるので「Started ...」から確認します。
docker compose logs -f web
- HTTPメソッドとパスを確認
正常なら以下のように出るはずです。しかし今回のログはこうでした👇Started DELETE "/dogs/2" for 127.0.0.1 Processing by DogsController#destroy as HTML Parameters: {"id"=>"2"}
本来 /dogs/2 になるはずが /dogs.2 になってしまっている!Started DELETE "/dogs.2?_method=delete" ... ActionController::RoutingError (No route matches [DELETE] "/dogs.2")
- ビューのリンク記述を確認
実際のコード:DELETE機能で「dogs」としているのが原因でした。対象は一つのハズです!= link_to "削除", dogs_path(@dog), data: { turbo_method: :delete, turbo_confirm: "本当に削除しますか?" }
- 修正
正しくは単数系の dog_path(@dog) を使います。= link_to "削除", dog_path(@dog), data: { turbo_method: :delete, turbo_confirm: "本当に削除しますか?" }, class: "inline-flex items-center bg-red-500 hover:bg-red-600 text-white font-semibold py-2 px-4 rounded-lg transition-all duration-300"
- 修正後のログ
再度削除を実行すると無事に削除成功しました!Started DELETE "/dogs/2"
Processing by DogsController#destroy as HTML
Parameters: {"id"=>"2"}
Dog Load (0.5ms) SELECT "dogs".* FROM "dogs" WHERE "dogs"."id" = $1 LIMIT $2
TRANSACTION (0.2ms) BEGIN
Dog Destroy (1.0ms) DELETE FROM "dogs" WHERE "dogs"."id" = $1
TRANSACTION (0.3ms) COMMIT
Redirected to http://localhost:3000/dogs
```
ハマったこと・解決策
- Routingerrorだったためrouts.rbファイルに問題があると思いきやビューの記述ミスでした💦
- こういう小さい積み重ねからエンジニアとしての技量が高まるんだと実感します。
AIも素晴らしいですが、軽微な修正ならどこに問題があるか感覚としてわかったほうがいいなと思います。
おわりに
壁にぶちあたった時は焦らず、
- ログを見る
- リクエストパスとHTTPメソッドを確認
- MVCのどこに問題があるか切り分ける
この順序で進めれば原因究明の一歩です!
番外編
binding.pry を使ったデバッグではdocker attach
コマンドを使用するが、docker compose logs -f
との違いは?
-
docker attach
基本的には「中に入って操作したい」とき用(docker exec の代替みたいな感じ)- 直接入力できる
- Ctrl+C を押すとコンテナごと終了する危険性がある
-
docker compose logs -f web
コンテナが出力しているログを「安全に横から覗く」仕組み- 読み取り専用
- 安全に出入りができる