naichi's lab

3日後の自分(他人)への書き置き

【Rails】assets:precompileでjpegの拡張子が勝手に変わってどハマりした話

f:id:naichilab:20180209212201p:plain

今日はRailsでとある挙動に悩まされていたけど、やっと原因が分かってスッキリしたので書いておく。

環境

  • ruby 2.4.1
  • Rails 5.1.4

前提

  1. Railsで画像ファイル等を使う場合、production環境だとrake assets:precompile が必要
  2. herokuはデプロイ時に precompile を勝手にやってくれる

ここまで知ってました。

今日あったこと

https://letsplaylist.genieus.co.jp/ のトップ画像

  • app/assets/images/hero.jpeg に入れてあった

scssでは問題なく使えている

  • background-image: image-url("hero.jpeg");

erbで画像パスを使いたい

  • <%= image_url('hero.jpeg') %> と書いてデプロイした

Twitterカードの対応で、画像パスをhtmlに埋め込みたかった

なぜかエラー

  • ActionView::Template::Error (The asset "hero.jpeg" is not present in the asset pipeline.):

(ここで数時間の)無駄な調査

  • herokuのproduction、staging環境ではいつも image_url 使っているので、ReviewAppが悪いのではないかと勘違いする
  • ReviewAppのデプロイログを確認する
    • assets:precompile 実行されている
  • そもそもTOP画像はちゃんと出ている
    • なぜだ
  • みたいな感じで時間がかかる

実ファイル見てみよう

herokuは動作中の環境にssh接続できる

  • heroku run bash -a letsplaylist-staging-pr-116
~ $ ls public/assets/
省略〜〜
hero-d80ba23233558abbd91f408cf7c9c178d645bd0cb2ddbffe387ace3f071a1b7b.jpg

拡張子が!!!変わってる!!!!

.jpeg -> .jpg

これはsprocketsの仕様みたい

github.com

マジかよ・・・知らんかった・・・

まとめ

  • .jpeg は使うのやめよう
  • scssは変換してくれるんですね・・・