ローカル環境ではちゃんと表示出来ているのに本番環境でページが表示されない!
がーん!!!
他のページは表示されてるのに・・・
気を取り直して、状況を整理して原因を特定してみる
1,デプロイ自体は上手くいっている? ので他のページは表示されている
2,特定のページだけ表示されていない
3、しかしローカルではちゃんと表示されている(ここ重要)
以上から なんとな〜く 特定のページに対して ローカルと本番環境で何か相違が起きてると想像する。
例えばbundler のバージョンが ローカルと本番環境で異なっている場合 全体のデプロイが上手くいかないはずなので おそらく該当のページに対して 何らかのエラーなんだろうな〜
と考えてみても仕方ないので catコマンドでproductionログを見てみることにする
cat /var/www/(アプリ名)/current/log/production.log
膨大なログをずーーーーっと眺めていると・・・
あっ FATAL(エラー)表示を発見した。
ふむふむ 「商品の状態」 近辺でエラー発生とな
商品の状態ってここのことですな
あーこの表示作って データを送信出来るようにモデルとマイグレーションファイル修正したわ〜
と思い
:status って カラム名:state を変更したんだっけな あとint型に変更したな〜 と思いつつ
ここで気が付いた!
本番環境のデータベースそのままやんけ と。
すぐに本番環境のmysqlを確認
mysql -u root -p
データベースを見る
show databases;
データベースを指定して
use データベース名_production;
テーブルを確認
show tables;
テーブルの中身を確認
show columns from テーブル名;
で確認しました
あった
:statusに変えたはずのカラムが本番環境では :stateのままでした。
ローカル環境と本番環境でテーブルの中身が違うと本番環境では正しく表示されない
原因特定に成功した
では次にどうするか
本番環境でrails db:migrate を繰り返しても全然migrateされない
ま〜考えてみれば本番環境のデータベースが簡単にポンポン書き換えされちゃったら混乱するだけだから もうちっとmaigrateの方法を考えねば。
で僕が 取った方法は
本番環境のDBを一旦リセットして もう一度作り直す!
うぉおおおおおーーーー!やってやんぜ! 本番環境のDBをぶっ壊す!
状況説明が長くなりましたが ここから本題
本番環境のデータベースをリセットする
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
ポイントです
意図的にproduction environmentのDBを破壊したい場合は、
環境変数 DISABLE_DATABASE_ENVIRONMENT_CHECK=1指定してあげればOKです。
DBの破壊系はコマンド実行を防止する機能がRails5以降は装備されているため
db:drop
db:drop:all
db:purge
db:purge:all
db:purge:test
db:schema:load
のコマンドはDISABLE_DATABASE_ENVIRONMENT_CHECK=1が必要です
本番環境のDBの破壊に成功した後は DBを作り直す作業
rails db:create RAILS_ENV=production
本番環境でマイグレーション
rails db:migrate RAILS_ENV=production
無事本番環境のデータベース再構築完了です。