# 目次
- エラー内容
- 原因
- 解決方法
- 解決に至るまでの過程
- 参照
# エラー内容
herokuにデプロイして本番環境で動作確認しようとしたところ、トップページが表示されずエラー画面が表示された。
ここまでの操作は下記の通り。
-
git push heroku master
コマンドで変更点をherokuにpush -
heroku run rails db:migrate
コマンドでheroku上でマイグレーションを実行 - 本番環境で動作確認しようとしたら下記エラー画面が表示された
原因
最終的に辿り着いた原因は、親子関係のテーブルを子の方から実行しようとしていた為だった。
% heroku run rails db:migrate:status
Running rails db:migrate:status on ⬢ アプリ名... up, run.5884 (Free)
database: heroku_e31ab517f6045b0
Status Migration ID Migration Name
--------------------------------------------------
D, [2021-08-16T09:07:05.261846 #4] DEBUG -- : (2.8ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
up 20210806082257 Devise create users
up 20210809080251 Create items
up 20210810015843 Create active storage tablesactive storage
down 20210812105413 Create receiver addresses
down 20210812105529 Create buyers
receiver addresses
とbuyers
のアソシエーションは、
receiver address belongs to buyer
かつbuyer has one receiver address
子テーブルのreceiver addresses
を先にマイグレーションしていた為、外部キーのbuyer_id
が存在しなかったことが原因。
解決方法
buyers
テーブルをマイグレーションした後に、receiver addresses
テーブル をマイグレーションすることで解決。
・buyers
テーブルをマイグレーション
% heroku run bundle exec rake db:migrate:up VERSION=20210812105529
#### ・ ``receiver addresses``テーブル をマイグレーション
% heroku run bundle exec rake db:migrate:up VERSION=20210812105413
#### ・マイグレーション成功
% heroku run rails db:migrate:status
Running rails db:migrate:status on ⬢ アプリ名... up, run.3437 (Free)
database: heroku_e31ab517f6045b0
Status Migration ID Migration Name
--------------------------------------------------
D, [2021-08-16T09:27:32.835956 #4] DEBUG -- : (3.6ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
up 20210806082257 Devise create users
up 20210809080251 Create items
up 20210810015843 Create active storage tablesactive storage
up 20210812105413 Create receiver addresses
up 20210812105529 Create buyers
解決に至るまでの過程
エラー画面
「何かが間違っています。
もしあなたがアプリケーションのオーナーなら、より多くの情報を得るためにログを確認してください。」
の様な意味だと思います。
ログを確認
% heroku logs --tail --app アプリ名
コマンドをターミナルで実行しログを確認。
2021-08-16T08:37:14.547570+00:00 ...
request_id=6118eb52-8198-4ff6-8797-6efde06df1cc fwd="39.110.211.37"
dyno=web.1 connect=1ms service=42ms status=500 bytes=1827 protocol=https
ログを辿ると status=500
と赤字で表示されていた。
HTTPステータスが500の場合、「サーバーサイドで何かしらのエラーが発生している」らしい。
ざっくりした内容にびっくり。
herokuへのデプロイ時にstatus=500
になる場合をググってみた
ググってみたが、今回の問題に役立ちそうなサイトは見つけられず、、
一旦方針転換。
heroku run rails db:migrate
コマンドでheroku上でマイグレーションを実行した時のログを辿ってみた
エラー文発見。
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'heroku_e31ab517f6045b0.buyers' doesn't exist
buyer
テーブルが存在していない、とのこと。
更に辿ると、、
Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'heroku_e31ab517f6045b0.buyers' doesn't exist
再びbuyer
テーブルが存在していない、、とのこと。
Caused by:
Mysql2::Error: Table 'heroku_e31ab517f6045b0.buyers' doesn't exist
また出た。
Caused by:
Mysql2::Error: Cannot add foreign key constraint
何やら意味ありげなエラー文を発見。
「外部キーを加えられません」という様なエラーかなと推測して、エラー文をそのままググってみる。
これで解決策を発見した。
参照:
db:migrateがうまくいかない Cannot add foreign key constraint 外部キーの制約がおかしいのか
質問者様、回答者様ありがとうございます。感謝です。
記事内で、親テーブルを先に作成しないと子テーブルの外部キーを作成できないよ、という内容が書いてあり、これじゃないか!?とピンときました。
再度heroku上のマイグレーションの実行状況を確認
% heroku run rails db:migrate:status
Running rails db:migrate:status on ⬢ アプリ名... up, run.5884 (Free)
database: heroku_e31ab517f6045b0
Status Migration ID Migration Name
--------------------------------------------------
D, [2021-08-16T09:07:05.261846 #4] DEBUG -- : (2.8ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
up 20210806082257 Devise create users
up 20210809080251 Create items
up 20210810015843 Create active storage tablesactive storage
down 20210812105413 Create receiver addresses
down 20210812105529 Create buyers
やっぱり、子テーブルを先に作成しようとしていた。
ここまで分かったところで、上述の解決方法を実行し解決。すっきりした、、
ローカル環境では、問題なく実行できたけど、何でなんだろう。
実行後にモデルを色々いじったからかな?
参照
db:migrateがうまくいかない Cannot add foreign key constraint 外部キーの制約がおかしいのか
【heroku】railsアプリのデプロイ決定版の記事見てもコケた箇所
[rails]herokuのデプロイエラーActionView::Template::Error (Mysql2::Error: Table --- doesn't exist):
ActionView::Template::Error (Mysql2::Error: Table'heroku_(テーブルの情報?)' doesn't exist):
Ruby on Raisで指定マイグレーション ファイルのみ実行する
[Ruby]ActiveRecord::StatementInvalid in UsersController#create を解消できません