Herokuデプロイ後にNoMethodErrorの沼にハマる

満を持して、RailsのアプリをHerokuにデプロイ。

 

「いやあああ、これでRail開発もひと段落やわああああああ」

と思い、おしぼりを目に当てようとすると、エラー発生!

We’re sorry, but something went wrong.
If you are the application owner check the logs for more information.

ローカル環境で問題なかったのに、なぜにデプロイ後に?

$ heroku logs -t

でエラー原因を探ると、次の手がかりを炙り出せました。

  • NoMethodError (undefined method password_digest=’ for #<User:0x0000563bc9b410d0>
  • app/controllers/users_controller.rb:50:in create’

 

エラーが出た経緯を書いておきましょう。

git add .

git commit -m "first"

でコミットし、

git push heroku master

でHerokuにデプロイ。

さらにそのあと、マイグレーションのコマンド

heroku run rails db:migrate

を発動させた後でした。

 

アプリのトップページに飛んだら、サイトへアクセスできました。

ただ、調子に乗って、会員登録(ユーザーを作成)しようと「作成ボタン」を押した瞬間、

「Sorry」と出てしまったのです。

 

助けを求めてググって言いましたが、どれもこれも参考になりません。

マイグレーション忘れとか、$ heroku restartでリセットするとか、そういうものばっかり。

どれを試してもNoMethodErrorエラーは解決しません。

あまりの現実の厳しさに、Railsアプリ開発を諦めようと思ったこともありました。

 

データベースをチェックしたら、突破口を開けた

今にも腐りそうでしたが、

「いや、ちょっと待って。データベースはちゃんと反映されているのか?」

HerokuのDataclipsでデータベースをチェック。

 

すると、「あるはずのテーブル」が1mmも作られていないと判明したのです!

半分ぐらい作られて終わっていたのですね。

エラーの原因となっていた「usersテーブル」にあるはずの「password_digestカラム」はありません。

別に作った「likesテーブル」はそもそも存在していないようでした。

これらのことから、

マイグレーションが完璧にできておらず、データベースが完全に作られなかった

という仮説が浮かび上がってきました。

 

とどのつまり、usersテーブルにあるはずのpassword_digestカラムがなかったので、ユーザーを作成すると、

password_digestカラムに当てはまる値ないよ?

というエラーだったのはないか、と。

 

「こ、これだ」

 

試しにもう一度、

$ heroku run rails db:migrate

でマイグレーションすると、次のエラーが出ていると気づきました。

I, [2020-05-21T13:32:01.670278 #4] INFO — : Migrating to Yokeidelete (20200316130257)
D, [2020-05-21T13:32:01.672430 #4] DEBUG — : (0.5ms) BEGIN
== 20200316130257 Yokeidelete: migrating ======================================
remove_column(:users, :age, :integer)
D, [2020-05-21T13:32:01.674863 #4] DEBUG — : (2.1ms) ALTER TABLE “users” DROP COLUMN “age”
D, [2020-05-21T13:32:01.675659 #4] DEBUG — : (0.6ms) ROLLBACK
D, [2020-05-21T13:32:01.676657 #4] DEBUG — : (0.7ms) SELECT pg_advisory_unlock(5566982743631305500)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedColumn: ERROR: column “age” of relation “users” does not exist
: ALTER TABLE “users” DROP COLUMN “age”

 

てっきりマイグレーションは成功と思っていましたが、

途中でマイグレーションはストップしていたのです。

rails abort!

って出ちゃっていますから。

 

読んでみると

20200316130257 Yokeidelete

というマイグレーションファイルでエラーを起こしていて、

remove_column(:users, :age, :integer)

が実行できない、と。

 

しかも、エラー原因までわかりやすく書いてくれていて

column “age” of relation “users” does not exist

つまり、

usersテーブルにageカラムないぞ?

と言っています。

remove_column(:users, :age, :integer)

でageカラム削除しようとしているけど、そもそもusersテーブルにないやん?

となっているのですね。

 

これはやべえミスです。

このクソみたいなマイグレーションファイルは、何を隠そう、ぼく自身が生み出したものです。

Railsのカラム追加・削除方法を覚えるため、練習で作ったマイグレーションファイルの一部ではありませんか。

 

 

「お前達が原因だったんかいw」

 

その他にも練習で作ったままにしていたマイグレーションファイルが「6~7つ」ありました。

ってことで、練習用マイグレーションファイルをすべて削除。

その後に

$ heroku run rails db:migrate

を実行すると、エラーなしでマイグレーションできましたね。

 

その上でHerokuアプリにアクセスすると・・・・・・

エラー消失!!

アプリとして機能し、ユーザーも作れるではありませんか。

 

やりました、やりました。

やっと「エラーの沼」から脱出しましたよ。

 

いやあ、間一髪。

エラーを解決できずにアプリを作り直すところでした。

 

NoMethodErrorに苦しむ方は、マイグレーションできなかった可能性もあります。

そこらへんをチェックしましょう。

 

それでは!

Lin