HerokuにRailsアプリをデプロイしたらNoMethodErrorが出たときの対処法




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後に?

 

でエラー原因を探ってみると、次のような手がかりが炙り出されました。

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

 

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

でコミットし、

でHerokuにデプロイ。

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

を発動させた後でした。

 

その後にちゃんとアプリのトップページに飛んだらへアクセスできたので、会員登録(ユーザーを作成)しようと作成ボタンを押した瞬間、

Sorryと出てしまったんです。

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

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

どれを試してもかのNoMethodErrorエラーは解決しなかったのです。

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

 

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

エラーがなかなか解決できなかったので今にも腐りそうでしたが、

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

とHerokuのDataclipsという機能を使ってデータベースをチェックしてみました。

 

すると、作られているはずのテーブルが全く作られていないことが判明したのです!

全部作られていないというわけではなく、半分ぐらいで作られて終わってしまっていたのですね。

エラーの原因となっていたusersテーブルにあるはずのpassword_digestカラムはありませんでしたし、別に作ったlikesテーブルはそもそも存在していないようでした。

つまりこれらのことから、

マイグレーションがちゃんとできていなかったために、データベースが作られなかった

という事実が浮かび上がってきました。

このマイグレーションの不具合により、NoMethodErrorエラーが出てしまったのではないか、と。

 

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

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

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

 

「こ、これだ」

試しにもう一度、

でマイグレーションしてみると次のエラーが出ていることに気がつきました。

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”

 

マイグレーション後にHerokuアプリにアクセスできたので、てっきりマイグレーションは成功していると思いっていたのですが、

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

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つありました。

その中でエラーが出ていたremove_columnメソッドを発動しているマイグレーションファイルを全て削除。

その後にもう一度

を実行すると、エラーなしでマイグレーションできているようでした。

 

その上でHerokuのアプリのURLにアクセスしてみると・・・・・・

エラー消失!!

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

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

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

 

いやあ、間一髪。

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

 

ぼくと同じくNoMethodErrorに苦しむ方は、まずはマイグレーションできなかった可能性もあるのでそこらへんをチェックしましょう。

 

それでは!

Lin

Pocket
LINEで送る




音生入力で楽にブログを書く技が満載!
ブログ音声入力術

音声入力の使い方から文章を書くコツまで完全網羅。ブログを書きたいすべての人向けの電子書籍




コメントを残す

メールアドレスが公開されることはありません。