タイトルが全ての内容だがめちゃくちゃはまったのでメモとしてまとめておきます。
Ruby:2.6.5 Rails:5.2 webpacker無し サーバー:unicorn
この環境でdevelopment環境では問題なく表示されてたページが500を返すようになった
いろいろ見ると問題なく表示されるページもある
ログをみると
Completed 500 Internal Server Error in 7ms
ActionView::Template::Error (The asset "top/logo" is not present in the asset pipeline.):
となっていてどうやらasset pipelineの関連で失敗しているよう、該当の部分のviewを抜粋するとこんな感じ
= 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にすると動的コンパイルが働く
ちょっと考えれば分かることだがそんなことしたら本番環境の意味がほぼ無い
開発環境と同じ状態なので当然動くことは動くが
プリコンパイルすることでサーバーの負荷を少なくしているのに動的コンパイルをオンにしたら
そもそもプリコンパイルもいらないじゃんってはなしで根本的な解決ではない
ということで自力で色々試してみたら解決できた
画像ファイルを拡張子まで指定するだけ
= image_tag 'top/logo.png'
.pngを足しただけで全て解決。
どうやら開発環境の動的コンパイルでは画像の拡張子までは指定しなくてもsproketsが補完してうまく配信してくれるもよう
Railsガイドをみると本番環境ではプリコンパイル時に作られる.sprockets-manifest-md5hash.json
というマニュフェストファイルで
viewに書かれてるlogo.png
をコンパイルされたアセットハッシュ付きのpublic/assets/top/logo-88(~略~)b667.png
に結びつけてるいるが
ここでは画像の拡張子までは補完してくれないのだと思う
思ったよりもかなり単純な問題だったが、開発環境では問題なく動くのに本番環境では動かないというケースは結構はまりやすい