はじめに
Railsで作ったアプリをHerokuにデプロイ後、普通に動いているのを確認。
その後、改良を重ねたコードをデプロイしたらエラー画面が出る様になってしまいました。
具体的にはCRUD機能のC。Create(新規投稿)機能でデータベースにparamsを登録しようとするととエラー画面が出る様に。
テーブルにカラムを追加したからそれが原因かと思いきや...
色々と対応してみた忘備録となっています。
プログラミング歴1ヶ月ちょっとの初心者ですので、間違いやもっといい方法がありましたらご指南・ご指摘を頂けると幸いです!
環境
Ruby 3.0.1
rails6.1.7.3
Heroku-20
トラブルの原因
とりあえずログを見てエラー原因を特定しようと思いターミナルで
heroku logs
を実行。
ログを遡ってみると
ActiveModel::UnknownAttributeError
(unknown attribute 'period' for Task.):
と言うエラーメッセージを確認することができました。
Taskテーブルに'period'なんてカラムが存在しないと教えてくれています。
そういえば、テーブルにカラムを追加したけどherokuのマイグレートしてないしそれが原因かなと思ったら......
やってみたこと
Herokuにデーターベースを移行
heroku run rails db:migrate
を実行してテーブルにperiod
カラムを追加してみました。
こちらのサイトを参考にデータベースにちゃんとperiod
カラムが追加されているか確認してみると
確かにperiodカラムが追加されているのを確認!
これで万事解決万々歳とアプリで動作確認をしてみると...
ログを改めて確認すると
なんでエラー画面が出るんだろうと改めてログを確認してみると
ActiveModel::UnknownAttributeError
(unknown attribute 'period' for Task.):
やっぱりこのエラーが発生しています。
困ったらリセット
困ったら先人の知恵を頼ろうかなとQiita内を探してみると今の自分にぴったりの記事がありました。
本番環境のデータベースに原因がある時にデータベースをリセットするとエラー解消できるという可能性があると言うことで記事を参考にHerokuのデーターベースを削除・改めてマイグレートをし、これで勝ったと思ったら...
失敗???
スキーマが破損?
よくよく読むとこの記事でもリセットしただけではエラーが解消されず、アプリを削除・再デプロイしたら解決できたと書いてありました。
とりあえず上の方法で問題を解決できそうなことがわかりましたが、エラーの原因がよくわかりません。
なにかそれらしい原因の解説がないかを探してみるとこのサイトにスキーマがうまく同期していないことが原因という記述を発見。
rake db:drop db:create db:migrate db:schema:dump db:setup
のコマンドと
heroku restart
をターミナルで実行すると解決すると書いてあります。実際に実行をしてみると無事、新規投稿機能がアプリ上で動作する様になりました
コマンドの解説
rake db:drop db:create db:migrate db:schema:dump db:setup
ChatGPT先生によると
とのこと。
つまりデータベースをリセットするだけではなくて削除して作り直したことが良かったみたいです。
参考
HEROKU POSTGRESでテーブル作成・確認方法
【Rails】Heroku上でのActiveModel::UnknownAttributeError解決方法
Heroku Rails - ActiveRecord::UnknownAttributeError (unknown attribute 'user_id' for Timetable.):