概要・エラー文
本番環境(Heroku)でデータを新規保存しようとすると、「We're sorry,but something went wrong.」と表示され、保存に失敗する。
解決までの道筋
1.ローカル環境で新規保存できるか確認
念のため、ローカル環境で新規保存できるか確認します。
結果、ローカル環境では成功し、本番環境(heroku)でのみ上記のようなエラーが発生します。
2.本番環境のログを表示し、エラーログを確認
本番環境のログを表示し、エラー詳細について調べます。本番環境のログを表示するために、ターミナルで以下のコマンドを入力します。
heroku logs --tail --app アプリ名
結果、ログの中にエラーログらしき文を確認しました。
Completed 500 Internal Server Error in 14ms (ActiveRecord: 7.8ms | Allocations: 921) ActiveModel::UnknownAttributeError (unknown attribute 'explanation' for Recipe.):
3.エラー文について検索
Completed 500 Internal Server Error in 14ms (ActiveRecord: 7.8ms | Allocations: 921)
500 Internal Server Error = サーバーエラーレスポンス
サーバー側で処理方法がわからない事態が発生したことを示すようです。
引用: https://developer.mozilla.org/ja/docs/Web/HTTP/Status
ActiveModel::UnknownAttributeError (unknown attribute 'explanation' for Recipe.):
recipeテーブルにexplanationカラムがないことで発生するエラーのようです。
引用: https://teratail.com/questions/92273?link=qa_related_pc
4.recipeテーブルにexplanationカラムがないことを確認
念のため、ローカル環境でも確認しましたが、recipeテーブルにexplanationカラムを確認しました。
次に、本番環境で確認します。本番環境でのは、以下の手順で確認します。
-
ターミナルでrails consoleを起動
heroku run rails console
-
DBとの接続情報を表示
irb(main):014:0> ActiveRecord::Base.connection_config
-
本番環境での全テーブル名を確認
irb(main):005:0> ActiveRecord::Base.connection.tables
-
本番環境の対象テーブルに対象カラムがあるかを確認
Recipe.inspect
Recipeテーブルにexplanationカラムが無いことを確認
引用: https://teratail.com/questions/92273?link=qa_related_pc
5.本番環境のデータベースをリセット
ここまでで本番環境のデータベースにエラーの原因があることを確認したので、本番環境のデータベースをリセットし、再度マイグレートを行い、修正を試みる。
-
本番環境のデータベースをリセット
heroku pg:reset DATABASE
-
本番環境でデータベースをマイグレート
heroku run rails db:migrate
-
再度カラムを確認
Recipe.inspect
やはりRecipeテーブルにexplanationカラムが無い。
引用: https://jonconan.site/technical/569
6.本番環境のアプリを削除→再度作成
データベースをリセットしてもエラー解決には至らなかったため、一度本番環境上のアプリを削除し、再度作成します。
heroku apps:destroy --app アプリ名 --confirm アプリ名
引用: https://qiita.com/chihiro/items/5c3ff400f6cb99deb945
7.解決!
本番環境にて再度データを新規保存しようとしたところ、保存に成功しました。
結論
heroku上のアプリを削除・再作成する。
考察
今回の手法は、本番環境で適当なデータしか保存していなかったため可能ですね。本番環境でのデータ登録は、最後がベストであることを再認識できました。
開発環境
- ruby 2.6.5
- rails 6.0.0
- mysql2 0.4.4