Railsで作成したアプリのHerokuへのデプロイ時に躓いたところ(cloud9→Github→Heroku)

Railsで作成したアプリのHerokuへのデプロイ時に躓いたところ(cloud9→Github→Heroku)

基本的に下記の記事を参考に進めたが、中途半端にアプリを作成した時点でデプロイを試してみたといった経緯もあり、デプロイの過程で3点つまずいたところがあったので、改善点の記載。

https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

※初めてのRailsでのアプリ作成のため、経験者からすると色々と信じられない手順もあるかもしれないでっす。

git push heroku master時の「Precompiling assets failed.」エラー

上記エラー発生時のログを確認したところ、下記のように記載されている。
Uglifier::Error: Unexpected token: name (foobar_foobar). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).

こちらのエラーについては、ES6に関わる内容がコンパイルできなかったという意味らしい。

下記サイトを参考に、 config/environments/production.rbの記載を修正したところ、デプロイできた。

 

さぁ、無事デプロイできたのでheroku run rails db:migrateを行ったところ、今度は以下のエラーが表示された。

heroku run rails db:migrate時の「PG::UndefinedTable: ERROR: relation “○○” does not exist」

簡単に言えば、”○○” のテーブルが無いですよ。というエラーらしい。

こちらのエラーについては、下記の記事が分かりやすく解説してくださっており、要は、migrationファイルが削除されていることにより発生しているらしい。

記事の記載を参考に、あらためて、migrationファイルを作成。

$ touch 20190507134142_create_search_data.rb

その後、heroku run rails db:migrateを行うと、今度は以下のエラーが表示された。

rails aborted!
ActiveRecord::DuplicateMigrationNameError:
Multiple migrations have the name ○○○○

このエラーについては、重複したマイグレーションファイルができている場合に発生するらしい。(ファイル名や、migrationファイル内のclass Create○○の部分が合致している場合かな?)

https://teratail.com/questions/59846

誤って削除したmigrationファイルの復活時にコピペで作成していたために、こんなことになっていた。。

このエラーが発生した場合、普通は重複しているmigrationファイルを削除することで、解決するらしい。(migrationファイルの削除については下記がわかりやすかったです。)

railsのrakeのmigrationファイルを削除しNO FILEとstatusに出た時の対処

 

が、、、私の場合、もともとが既にDBに反映済みmigrationファイルを削除したところから始まっているため、上記手段では完全なる改善はできない。

そんなこんなで、migrationファイルがかなり入り組んだ状況となっていて、どうしようもなかった。。。

そこで、最終手段として「rails db:migrate:reset」を実行する。

https://ja.stackoverflow.com/questions/39554/migration%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%82%AB%E3%83%A9%E3%83%A0%E3%82%92%E8%BF%BD%E5%8A%A0-%E5%89%8A%E9%99%A4%E3%81%97%E3%81%A6%E3%82%82schema-rb%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%8B

これは簡単に言えば、それまでのDB状況をリセットして、あらためてmigrationファイルを古いバージョン順に適用させていくコマンド。

DB内に保存しているデータも全てすっ飛んでいくが、仕方ない。

 

上記を実行して、再度、heroku run rails db:migrateを実行して、無事、反映され、、、ると思うじゃん?

 

今度は以下のエラーが表示された。

rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DatatypeMismatch: ERROR: column “published_time” cannot be cast automatically to type time without time zone
HINT: You might need to specify “USING published_time::time without time zone”.
: ALTER TABLE “search_results” ALTER COLUMN “published_time” TYPE time

heroku run rails db:migrate時の、「column “published_time” cannot be cast automatically to type time without time zone」エラー

migration上で、最初にtime型で作成していたテーブルを後からdatetime型に変換する操作を行っていたが、PostgreSQLではこの順番での変換(つまりtime型→datetime型への変換)ができないために上記エラーが発生していたらしい。

詳しくは下記がわかりやすい。

https://teratail.com/questions/102460

最初から、”published_time”カラムにdatetime型が適用されるよう、migrationファイルの設定をあらためて行う。

※既にrails db:migrate:resetを実行しているため、怖くない。

 

上記で修正を行った後、やっとheroku run rails db:migrateが実行できた………!!!

 

migrationファイルって簡単に作成できるし、rails初心者だと意味分からん部分が多いけど、こんなにも大切に扱わなきゃいけないものなのね。

今後アプリ開発を行う場合には本番環境/開発環境でDBを統一して、migrationファイルの扱いにも細心の注意を払っていく。