#はじめに
私は現在プログラミング勉強中の身でして、個人アプリを作成して発表する課題を課せられておりました。
アプリは完全には出来上がってませんが、まずは発表会に向けてデプロイ!
とのことでherokuにデプロイすることにしました。
EC2より簡単だ。
こんなに手軽にできるなんて!
というような噂を聞いたのでherokuにしようと思いました。
下記のような優良な記事もあり未来も明るいheroku。
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
※とても良い記事!おすすめです!
しかしながら、エラーとバグを出しやすい性分でして、しっかりとエラー出たので報告します。
今回紹介するのは下記の3つです。
- migrateファイル履歴ででたエラー
- railsのメソッドが原因で500エラー
- faviconが表示されない
#【1】migrateファイル履歴ででたエラー
結果的にDBを一度ぶっ壊し、再度作り直す羽目になりました。
チーム開発では絶対にやりたくない。
##コトの顛末
heroku内でマイグレートコマンドを打つと下記のようなエラーが出ました。
D, [2019-12-04T07:45:57.335852 #4] DEBUG -- : (1.2ms) SELECT pg_advisory_unlock(205462650132500460)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedTable: ERROR: relation "chapters" does not exist
: CREATE TABLE "movie_chapters" ("id" bigserial primary key, "movie_id" bigint, "chapter_id" bigint, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, CONSTRAINT "fk_rails_6c759d08a2"
FOREIGN KEY ("movie_id")
マイグレートが途中でコケていて、「中間テーブルがないよ!」って言われました。
でも、1対多なので中間テーブル必要ないはずなのになんでだろうな〜って思ったのですが...
##原因
ローカル開発中にDB作りを試行錯誤したことが原因。
と?言いますと?と思われましたよね。
どういうことかと言いますと、
マイグレートファイルって基本的には物理削除せず残しているかと思います。
herokuサーバー内にアップして、migrateすると、
その履歴を最初から順番にmigrateしてくれるんです。
当たり前のようですが、その動作によって
最終的なアソシエーションと、migrateの情報の差分出てその部分でコケました。
ローカル上では試行錯誤した上で、最終的な記述で動作してますが、
herokuにアップすると、間違ったことをした履歴を再現しながらマイグレートしているので、
結果的に昔適当に作った「中間テーブル作る」マイグレート履歴でエラー。
##解決のために行ったこと
DBに入った情報のバックアップをとる(CSVダウンロードなどしておく)
↓
DB削除する
↓
マイグレートファイルをロールバックして、status downにして物理削除
↓
modelファイルも削除コマンドでさようなら
(アソシエーションのバックアップやメモを取っておく)
↓
DBをもう一度作り直す
↓
無駄なことをしないマイグレートファイルを再度作り直す
↓
$rake db:migrate
↓
ローカルで動くか確認してherokuにデプロイ
↓
$heroku run rake db:migrate
↓
これでもダメだった。
herokuサーバ確認したらコケたmigrateの残留ファイルらしきものがいたので、
リポジトリからheroku削除してもう一度入れ直す
↓
再度デプロイ
↓
無事にフィニッシュ!
##教訓
他のサーバーでも似たようなことが起こるのかな?
DB設計とmigrate作業は慎重に!
慎重にできないなら作り直す覚悟をする。
私は後者だったわけですね。
#【2】railsのメソッドが原因で500エラー
このエラーがだいぶ厄介なものなようで、ローカルでは起こらないけど、
herokuで500エラーになることがままあるようです。
スクリプトの読み込みタグの先のファイルがなかったりとかで、そのようなことが起こるようです。
これはエラーログをみて潰していくしかないようです。
##原因はメソッドにあり
ランダムで動画を見せたいと思い、下記のようなメソッドを定義しました。
@chapter = Chapter.all.order("RANDOM()").limit(6)
これはローカル場のmySQLから値を持ってくる書き方で、
herokuでは**「Postgresql」**というところにDBがあり、
そこから値を持ってくる時はorder("RAND()")
と記述しなければならないそうなのです!
なので、使えないメソッドを使っている
↓
読み込めない
↓
サーバーエラー(500)
となったようです。
def index
rand = Rails.env.production? ? "RANDOM()" : "rand()"
@chapter = Chapter.all.order(rand).limit(6)
end
本番環境では"RANDOM()"
、それ以外では"rand()"
が入る````rand```変数を定義して使ってあげる。
これで解決しました!
###参考記事
Rails + heroku + order("rand()")が効かない話
ああああ兄貴ほんと助かりました。LOVE❤️
##このような修正をしました
#【3】faviconが表示されない
「問題なく動いてるぜ、ラリホー」と思いきや、せっかく作ったファビコン出てないじゃないの!!
検索してみると同じ現象が出ている方がおり、下記のような方法で修正しました。
app/assets/imagesにfavicon.ico
を配置して、
↓
application.html.hamlに= favicon_link_tag()
を記載する
↓
再アップしてページ更新で解決
###参考記事
rails5でfaviconの設定
#終わりに
いかがでしたでしょうか。
awsと違って短い時間で解決できましたが、
デプロイで問題が出てくることはよくあることなんだと思いました。
サーバーサービスごとにクセがあって、
ローカルでできたからと言って、浮かれていたらダイレクトダメージがあるなとわかってはいるんですが、
ローカルである程度できたら浮かれちゃいますよね〜。