ことの始まり
ポートフォリオMATRIXFLOWを作成している最中に事は起こりました。
※ MATRIXFLOWについてはこちらをご覧ください↓
一度、production環境(Heroku)にデプロイして問題ないことを確認したポートフォリオが機能追加後に再度pushすると画面真っ白になり何も動かず。
ことの詳細
次のような流れでした。
- ① 担当者(Membersモデルレコード)追加機能の実装
- ② フローステップ(FlowStepモデルレコード)追加機能の実装
- ③ production環境 Herokuにデプロイ
- (⇧ 😊機能問題なし!主要機能のマトリクスも作れる!ヨシ!😊 ⇧)
- ④ チェック項目(Checklistモデルレコード)追加機能の実装
- ⑤ development環境で問題なくチェック項目追加機能が動作する
- ⑥ production環境 Herokuにデプロイ
- (⇧ 😨production環境で動かない、画面真っ白😨 ⇧)
⑤でdevelopment環境で問題なく動いていることを確認したのに、
⑥のproduction環境で動作確認の段階で全く動かなくなり、
一旦問題なく動いていたところのcommitまで遡った内容をpushし直し、
デバックに着手しました。
※deploy内容はcommit単位で指定できます↓
バグの原因
バグの原因は、
development環境とproduction環境でauto loaderの仕様が異なることが原因でした。
上記の通り、④の機能を実装したときにエラーが起きたので
④の機能部分のコードが原因でした。
- クラス
Checklist
を作成していた - ルーティングの部分でクラス指定を
CheckList
としていた
上記のような不整合があったままでした。
開発環境のauto loaderの仕様ではエラーなく読み込まれるのですが、
本番環境のauto loaderの仕様が開発環境と異なるためにちゃんとエラーとして認識されるためでした。
(Ruby on Railsだとこの類のクラス名不整合は赤画面ですぐエラー吐き出し等されるのでLaravelもされるものだと思っていた。。)
本番環境のHerokuでLaravelのエラーが出力されるように設定し
確認すると下記のようなエラーが発生しており、
クラス指定の不整合を修正して解決しました。
2024-10-29T14:28:36.494311+00:00 app[web.1]: [29-Oct-2024 14:28:36 UTC] [2024-10-29 14:28:36] production.ERROR: Class "App\Models\Checklist" not found {"userId":6,"exception":"[object] (Error(code: 0): Class \"App\\Models\\Checklist\" not found at /app/app/Http/Controllers/ChecklistController.php:25)
2024-10-29T14:28:36.494330+00:00 app[web.1]: [stacktrace]
2024-10-29T14:28:36.494397+00:00 app[web.1]: #0 /app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(46): App\\Http\\Controllers\\ChecklistController->store()
2024-10-29T14:28:36.494477+00:00 app[web.1]: #1 /app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()
2024-10-29T14:28:36.494551+00:00 app[web.1]: #2 /app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(208): Illuminate\\Routing\\Route->runController()
2024-10-29T14:28:36.494620+00:00 app[web.1]: #3 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(808): Illuminate\\Routing\\Route->run()
2024-10-29T14:28:36.494705+00:00 app[web.1]: #4 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
2024-10-29T14:28:36.494778+00:00 app[web.1]: #5 /app/app/Http/Middleware/ForceHttps.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
参考
開発環境と本番環境でauto loaderの仕様が違うことは公式ドキュメントの下記部分に記載されていました。