Renderでログインや新規登録アイテム投稿などのページに遷移できないエラーが発生した時
ログイン画面に遷移するボタンをクリックした際に以下のような画面になる。We're sorry, but something went wrong.
If you are the application owner check the logs for more information.
今回発生したエラーの経緯
勉強のためフリマサイトのクローンを作成している際に発生。トップページのデプロイ時は問題なく、表示ができている状態。確認するべきこと
- Render.comのダッシュボードのLogsを開いてLogを確認する
- Searchの検索機能で「error」または「 rake aborted!」と入力してエラーの原因となる個所を探る
- errorの記述周辺にエラー原因の記述があった
エラーの原因
I, [2023-06-10T22:17:15.399052 #70] INFO -- : [340111ec-77b1-4007-b942-9e601bb7280f] Completed 500 Internal Server Error in 74ms (ActiveRecord: 35.5ms | Allocations: 6576)[340111ec-77b1-4007-b942-9e601bb7280f] ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 8: WHERE a.attrelid = '"users"'::regclass
今回はusersテーブルが存在しないため、それに関するページに遷移した時に発生していた模様。テーブルの設定ができていなかったようなのでVScodeの記述を確認した。
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
となっていてデータベースをmigrateするための記述が抜けていることが分かった。
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate #この記述を追加
上記のように編集したのちGitHubにコミット、プッシュしてデプロイ完了後確認すると問題なく表示ができるようになった。
ちなみに、Renderで作成したデータベースをリセットしたいときは以下の通り行う。
Renderで作成したデータベースをリセットする方法
#!/usr/bin/env bash
# exit on error
set -o errexit
bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
# bundle exec rake db:migrate ←コメントアウト
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset #追記
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
が、本番環境のデータベースを削除するために必要な設定。本番用のデータベースには重要なデータが含まれるため、通常は削除できないようになってる。
今回はリセットを行いため、明示的に削除を許可する設定を記述。
bundle exec rake db:migrate:reset
でデータベースをリセットする。以下の3つを順に実行したのと同じ動作をします。
rake db:drop(データベースの削除)
rake db:create(データベースの作成)
rake db:migrate(マイグレーションファイルの実行)
まとめ
- エラーが発生した時はLogを見る
- エラー発生個所がわからない場合はサーチ窓に「error」「rake abbord!」を入力してみる。
- bin/render-build.shファイルの記述はRenderにて実行するコマンドを入力しておくファイル
- db:migrateの記述がないとデータベースが本番環境にてmigrateされない
初歩的なところで躓いてしまったが、今回のエラーでrender.build.shファイルの役割が勉強できてよかった。