Rails4でGemの資産がAssets Precomplieに含まれないときは
Rails4プロジェクトでGem内の画像ファイルやフォントファイルといった資産がprecompile対象に含まれない原因と対策をまとめておきます。
原因は、assets precompileのデフォルトの対象変更です。対策としては以下の方法をとる必要があります。
- assets precompile に含まれるよう資産を移動する
- assets precompile に含めたい資産を明示する
原因
precompile対象ディレクトリの変更
Rails4では、パスにapp/assetsを含む資産のみをデフォルトのprecompile対象とするように変更されました。
rails/rails - Only compile non-js/css under app/assets by default
precompileのパスに置かれているREADME.mdのような"loose"なファイルを対象から外すこと、app/以下をオートロードするRailsの方針と合わせることなどが理由として挙げられています。(※1)
対象ディレクトリはどうなったか
このプルリクでは以下のような修正が取り込まれています。
railties/lib/rails/application/configuration.rb
@assets.precompile = [ Proc.new { |path, fn| fn =~ /app\/assets/ && !%w(.js .css).include?(File.extname(path)) },
/(?:\/|\\|\A)application\.(css|js)$/ ]
これにより、Rails.application.config.assets.pathsに定義されているディレクトリのうち、app/assetsというパスを含む、js, css 以外の資産とapplication.(js|css)が対象となり、lib/assetsやvendor/assetsにある画像やフォントといった資産はprecompileの対象外となりました。
もし、プロジェクトで利用しているGemが上記のディレクトリに js, css 以外のファイル(imageなど)をおいていた場合、本番配布時に頭を抱えることになります(※2)。
対策
assets precompile に含まれるよう資産を移動する
これがベストな解決案だと思います。
lib/assetsやvendor/assetsをapp/assetsに移動することで、Railsは配下の資産をprecompile対象として認識してくれます。
手元で試したところ、Rails3でも問題なく動作しました。
** 使っているGemが対応していなかったので こんな感じでPullRequest を出しました **
pkurek/flatui-rails - Move assets to app/assets for Rails 4
assets precompile に含めたい資産を明示する
Gemを触りたくない場合の対策です。
config/application.rbに以下のような記述を追加します。
config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)
読み込ませたい資産にあわせて配列内の拡張子を変更してください。
Rails.application.config.assets.pathsに含まれているのにPrecomplieされない点で大いにハマりましたが、GithubのPullRequestやIssueで経緯や理由を把握できました。
Githubほんと便利。
日本語の情報がまだ少ないのでまとめてみました。お役に立てばうれしいです。
※1. Issue内容を見るとこの変更に困惑している意見も一部ありますが、DHHは、This makes sense to me :+1:な感じ※2. 抱えました。