本番で新規登録画面にアクセスできないエラーを解決
はじめに
開発中のRailsアプリケーションにおいて、新規登録画面が開発環境では正常に表示されるにもかかわらず、本番環境ではエラーが発生する問題が起きた。原因を調査したところ、本番環境でデータベースのマイグレーションが実施されていないことが判明し、Herokuのログを確認した上で、heroku run rails db:migrate -a money-app-khiro
コマンドを実行してUsersテーブルを作成したことで、無事にエラーが解消され、新規登録画面が正常に表示されるようになった。この経験を通じて、本番環境でのデータベース設定やデプロイ後の確認作業の重要性を再認識することができた。
エラーの状況
開発中のRailsアプリケーションで、開発環境では新規登録画面にアクセスできている。
しかし、本番環境では、エラー画面になる。
その原因を探っていこう。
仮説
これまでの開発経験から、DBのマイグレーションが出来てないのではないか?という仮説を導き出した。
導き出したというよりも、直感的にそう思った。
新規登録画面を表示するまでのプロセスを追ってみる
開発環境では、新規登録画面を表示することができている。
なぜか?
http://localhost:3000/users/sign_upをURLに打ち込んだ後の処理のログは以下となる。
Started GET "/users/sign_in" for ::1 at 2024-11-16 10:14:11 +0900
Processing by Devise::SessionsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/sessions/new.html.erb within layouts/application
Rendered /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/shared/_links.html.erb (Duration: 0.3ms | Allocations: 246)
Rendered /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/sessions/new.html.erb within layouts/application (Duration: 4.1ms | Allocations: 2376)
Rendered layout layouts/application.html.erb (Duration: 6.8ms | Allocations: 4989)
Completed 200 OK in 10ms (Views: 8.1ms | ActiveRecord: 0.0ms | Allocations: 6542)
まずは、/users/sign_inをGETしている。
Started GET "/users/sign_in" for ::1 at 2024-11-16 10:14:11 +0900
次に、DeviseのSessionsControllerのnewアクションが呼ばれている。
Processing by Devise::SessionsController#new as HTML
そして、共通レイアウトのapplication.html.erbと、deviseの新規登録画面のnew.html.erbがレンダリングされている。
Rendering layout layouts/application.html.erb
Rendering /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/sessions/new.html.erb within layouts/application
_links.html.erbとnew.html.erbとapplication.html.erbがレンダリングされた。
Rendered /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/shared/_links.html.erb (Duration: 0.3ms | Allocations: 246)
Rendered /Users/hiroki/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/devise-4.9.4/app/views/devise/sessions/new.html.erb within layouts/application (Duration: 4.1ms | Allocations: 2376)
Rendered layout layouts/application.html.erb (Duration: 6.8ms | Allocations: 4989)
そして、200 OKステータスを返した。
Completed 200 OK in 10ms (Views: 8.1ms | ActiveRecord: 0.0ms | Allocations: 6542)
本番環境での確認事項
deviseがインストールされているかを確認しよう。
gemファイルには、以下の記載をしている。これを本番環境にアップしている(GitHubのmainブランチにプッシュしたコードが、Herokuと連携されるようにしてある)。
gem 'devise'
これを反映させるためのbundle installを本番環境で実施していないのが原因かもしれない。
deviseはインストールされていた
Herokuで以前mainブランチにプッシュした時のログを確認した。
以下の部分で、deviseのバージョン4.9.4をインストールして、Bundleが完了していることが分かった。
-----> Installing dependencies using bundler 2.3.25
Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
Fetching gem metadata from https://rubygems.org/..........
Fetching devise 4.9.4
Installing devise 4.9.4
Bundle complete! 17 Gemfile dependencies, 64 gems now installed.
Gems in the groups 'development' and 'test' were not installed.
Bundled gems are installed into `./vendor/bundle`
chatGPTに相談
エラー画面のURLを添えて相談してみた。
解答の中にHerokuのログを確認してみてくださいとあった。
-a アプリ名のオプションを追加して、確認してみた。Press any key・・・というところで、Enterキーを押すと、Herokuの画面が開いたあとにログが表示された。
hiroki@shibatahiroshitakanoiMac money-app % heroku logs --tail -a money-app-khiro
› Warning: heroku update available from 9.1.0 to 9.5.0.
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/82eaf137-724e-4d3f-8e91-fb364ab93c61?requestor=SFMyNTY.g2gDbQAAAA0yMDMuMTQwLjE5MC42bgYAwKW0MpMBYgABUYA.5V_MH0hFI3RsmHdNoyHbFOXcvCnXZIxt-XeZGmOgLYk
Logging in... done
2024-11-16T01:16:36.517918+00:00 app[web.1]: [f9864112-31b9-4f5a-9a97-fad96a604d2d] activesupport (7.0.4.3) lib/active_support/dependencies/interlock.rb:41:in `permit_concurrent_loads'
2024-11-16T01:16:36.517918+00:00 app[web.1]: [f9864112-31b9-4f5a-9a97-fad96a604d2d] activerecord (7.0.4.3) lib/active_record/connection_adapters/postgresql/database_statements.rb:18:in `block in query'
~~
2024-11-16T01:16:36.517949+00:00 app[web.1]: [f9864112-31b9-4f5a-9a97-fad96a604d2d] puma (5.6.5) lib/puma/thread_pool.rb:147:in `block in spawn_thread'
2024-11-16T01:16:36.518983+00:00 heroku[router]: at=info method=GET path="/users/sign_up" host=money-app-khiro-a414f54be759.herokuapp.com request_id=f9864112-31b9-4f5a-9a97-fad96a604d2d fwd="183.181.82.20" dyno=web.1 connect=0ms service=8ms status=500 bytes=1827 protocol=https
このログをGPTに送った。(~~の部分は、長いので省略)
以下の回答があった。
事件(エラー)は現場(本番)で起こっている
データベースの確認は、開発環境で行うと、Usersテーブルに必要なカラムがあることが確認できた。
hiroki@shibatahiroshitakanoiMac money-app % rails dbconsole
psql (14.13 (Homebrew))
Type "help" for help.
my_database_development=# \d users;
Table "public.users"
Column | Type | Collation | Nullable | Default
------------------------+--------------------------------+-----------+----------+-----------------------------------
id | bigint | | not null | nextval('users_id_seq'::regclass)
email | character varying | | not null | ''::character varying
encrypted_password | character varying | | not null | ''::character varying
reset_password_token | character varying | | |
reset_password_sent_at | timestamp(6) without time zone | | |
remember_created_at | timestamp(6) without time zone | | |
created_at | timestamp(6) without time zone | | not null |
updated_at | timestamp(6) without time zone | | not null |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
"index_users_on_email" UNIQUE, btree (email)
"index_users_on_reset_password_token" UNIQUE, btree (reset_password_token)
my_database_development=# ^C
my_database_development=# exit
しかし、今回のエラーは本番で起こっている。
事件は現場で起こっている。
本番でマイグレートしていなくてエラーになるということが以前にもあった。
解決
本番でマイグレートをかけてみると以下のようになった。
hiroki@shibatahiroshitakanoiMac money-app % heroku run rails db:migrate -a money-app-khiro
› Warning: heroku update available from 9.1.0 to 9.5.0.
Running rails db:migrate on ⬢ money-app-khiro... up, run.2673
I, [2024-11-16T02:08:08.396959 #2] INFO -- : Migrating to CreateDialies (20240829124343)
== 20240829124343 CreateDialies: migrating ====================================
-- create_table(:dialies)
-> 0.0929s
== 20240829124343 CreateDialies: migrated (0.0930s) ===========================
I, [2024-11-16T02:08:08.502666 #2] INFO -- : Migrating to DeviseCreateUsers (20240908122858)
== 20240908122858 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0129s
-- add_index(:users, :email, {:unique=>true})
-> 0.0065s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0036s
== 20240908122858 DeviseCreateUsers: migrated (0.0233s) =======================
以前開発環境で作成したDialiesテーブルとUsersテーブルが作成されているのが確認できた。
つまり、Usersテーブルに関しては、以下のマイグレーションファイルに記載の内容が本番環境で反映されていなかったということ。
それが反映されたため、users/sign_upで起こっていたエラーが解消された。
コメントを残す