【Heroku】デプロイ→ページが表示されない→親子関係のテーブルが実行されていなかった→親から実行して解決

#　目次

1. エラー内容
1. 原因
1. 解決方法
1. 解決に至るまでの過程
1. 参照



#　エラー内容

herokuにデプロイして本番環境で動作確認しようとしたところ、トップページが表示されずエラー画面が表示された。

ここまでの操作は下記の通り。

1. ```　git push heroku master ```コマンドで変更点をherokuにpush
2. ```heroku run rails db:migrate```コマンドでheroku上でマイグレーションを実行
3. 本番環境で動作確認しようとしたら下記エラー画面が表示された  

[![Image from Gyazo](https://i.gyazo.com/6ac3ef0ac41b077701a9055adeeb651c.png)](https://gyazo.com/6ac3ef0ac41b077701a9055adeeb651c)


# 原因

最終的に辿り着いた原因は、親子関係のテーブルを子の方から実行しようとしていた為だった。

```terminal
% 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``テーブル　をマイグレーションすることで解決。
<br>
#### ・``buyers`` テーブルをマイグレーション

```
% heroku run bundle exec rake db:migrate:up VERSION=20210812105529 
```
<br>
#### ・ ``receiver addresses``テーブル　をマイグレーション

```
% heroku run bundle exec rake db:migrate:up VERSION=20210812105413
```
<br>
#### ・マイグレーション成功

```terminal
 % 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
```
<br>

# 解決に至るまでの過程

### エラー画面

[![Image from Gyazo](https://i.gyazo.com/6ac3ef0ac41b077701a9055adeeb651c.png)](https://gyazo.com/6ac3ef0ac41b077701a9055adeeb651c)

「何かが間違っています。
もしあなたがアプリケーションのオーナーなら、より多くの情報を得るためにログを確認してください。」

の様な意味だと思います。

### ログを確認

``% heroku logs --tail --app アプリ名``　コマンドをターミナルで実行しログを確認。

```terminal
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ステータスが５００の場合、「サーバーサイドで何かしらのエラーが発生している」らしい。
ざっくりした内容にびっくり。


### 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　外部キーの制約がおかしいのか](https://teratail.com/questions/287457)

質問者様、回答者様ありがとうございます。感謝です。

記事内で、親テーブルを先に作成しないと子テーブルの外部キーを作成できないよ、という内容が書いてあり、これじゃないか！？とピンときました。


### 再度heroku上のマイグレーションの実行状況を確認

```terminal
% 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
```

やっぱり、子テーブルを先に作成しようとしていた。

ここまで分かったところで、上述の解決方法を実行し解決。すっきりした、、

<br>
ローカル環境では、問題なく実行できたけど、何でなんだろう。

実行後にモデルを色々いじったからかな？


# 参照

[db:migrateがうまくいかない　Cannot add foreign key constraint　外部キーの制約がおかしいのか](https://teratail.com/questions/287457)

[herokuにデプロイすると 『We're sorry, but something went wrong.If you are the application owner check the logs for more information.』が立ちはだかった。
](https://qiita.com/em_maeda/items/b29209c5a3c7f68b5d58)

[【heroku】railsアプリのデプロイ決定版の記事見てもコケた箇所](https://qiita.com/TheOkachanPG/items/9167ba77d1edf7addac2)

[[rails]herokuのデプロイエラーActionView::Template::Error (Mysql2::Error: Table --- doesn't exist):](https://qiita.com/rm_rzr/items/8cf3f7227082ce7a3dc6)

[ActionView::Template::Error (Mysql2::Error: Table'heroku_(テーブルの情報？)' doesn't exist):](https://qiita.com/output/items/21a0c435835349c110cd)

[Ruby on Raisで指定マイグレーション ファイルのみ実行する](https://programming-beginner-zeroichi.jp/articles/251)

[[Ruby]ActiveRecord::StatementInvalid in UsersController#create を解消できません
](https://teratail.com/questions/245617)