Railsでアプリを作成し、AWSにデプロイした際に不具合があるとこんなエラー画面が表示されます。
こいつめっちゃ腹立ちますよね。だってどこがおかしいのかすぐに教えてくれないんですよ。
#エラー原因の確認方法
しょうがないので自分で何がおかしいのかを確認します。
[ec2-user@ip-~~]$ cd /var/www/(アプリ名)/current/
[ec2-user@ip-~~ current]$ less log/production.log
ログを見ていくと、下記のようなエラー文を発見
ActionView::Template::Error (The asset "(画像ファイル名)" is not present in the asset pipeline.):
今回は画像ファイルの読み込みで何か問題が起きていることを特定します。
#原因
作成中のアプリでは、画像ファイルは下記に保管し、image_tagによって開発環境(ローカル)では問題なく表示されていました。
app/assets/images
= image_tag("ファイル名")
ではなぜ本番環境では読み込みができていないのか?
それは開発環境と本番環境でimagesディレクトリへのパスが異なるためです。
デプロイを実行すると、アセットパイプラインという機能によって画像ファイルやCSSファイルがコンパイル(圧縮)されます。すると、以下のようにimagesディレクトリへのパスが変化します。
アセットコンパイル前(開発環境)
app/assets/images
アセットコンパイル後(本番環境)
public/assets/images
#解決方法
HTMLファイルにはasset_pathを、CSSファイルにはimage-urlを適用することで、開発環境でも本番環境でも問題なく画像を表示することができます。
image_tag asset_path('ファイル名')
#ファイル名には「.jpg」など拡張子を忘れずに!
background-image: image-url("ファイル名");
#ファイル名には「.jpg」など拡張子を忘れずに!
今回は画像の読み込みに関するエラーでしたが、デプロイ時のエラーはEC2インスタンスや
Unicorn, nginx, SQLの再起動などで解消するケースもあるみたいです。
まずは、ログを見に行って原因を特定することが大事ですね。