LoginSignup
5
1

More than 3 years have passed since last update.

Rails 本番環境で画像のasset piplineが通らない=>画像の拡張子まで指定する

Last updated at Posted at 2020-02-06

タイトルが全ての内容だがめちゃくちゃはまったのでメモとしてまとめておきます。

Ruby:2.6.5 Rails:5.2 webpacker無し サーバー:unicorn
この環境でdevelopment環境では問題なく表示されてたページが500を返すようになった
いろいろ見ると問題なく表示されるページもある

ログをみると

log/production.log
Completed 500 Internal Server Error in 7ms
ActionView::Template::Error (The asset "top/logo" is not present in the asset pipeline.):

となっていてどうやらasset pipelineの関連で失敗しているよう、該当の部分のviewを抜粋するとこんな感じ

app/views/static_pages/top.html.slim
= image_tag 'top/logo'

app/assets/images/top/logo.pngに置いた画像ファイルをヘルパーを使って参照してる
development環境では問題なく表示できていたが
producition環境で動かしてみると画像が表示されないとかではなくサーバーエラーの500のページがレスポンスされるようになる

プリコンパイルになにか失敗したのかと思い、キャッシュを消してやり直したりサーバーの再起等を試しても一項にうまくいかず
Rails Asset Pipelineがうまくいかないときの問題の切り分けかた
を参考に色々試してみたが分からず、かなりはまった。

config/environments/production.rb はいじらない

簡単にググってみると
config/environments/production.rb
config.assets.compile = false
をtrueにしろとか書いてるのを見かけた

このオプションをtrueにすると動的コンパイルが働く
ちょっと考えれば分かることだがそんなことしたら本番環境の意味がほぼ無い
開発環境と同じ状態なので当然動くことは動くが
プリコンパイルすることでサーバーの負荷を少なくしているのに動的コンパイルをオンにしたら
そもそもプリコンパイルもいらないじゃんってはなしで根本的な解決ではない

ということで自力で色々試してみたら解決できた

画像ファイルを拡張子まで指定するだけ

app/views/static_pages/top.html.slim
= image_tag 'top/logo.png'

.pngを足しただけで全て解決。

どうやら開発環境の動的コンパイルでは画像の拡張子までは指定しなくてもsproketsが補完してうまく配信してくれるもよう

Railsガイドをみると本番環境ではプリコンパイル時に作られる.sprockets-manifest-md5hash.jsonというマニュフェストファイルで
viewに書かれてるlogo.pngをコンパイルされたアセットハッシュ付きのpublic/assets/top/logo-88(~略~)b667.pngに結びつけてるいるが
ここでは画像の拡張子までは補完してくれないのだと思う

思ったよりもかなり単純な問題だったが、開発環境では問題なく動くのに本番環境では動かないというケースは結構はまりやすい

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1