自分用メモ。
そもそもアセットパイプラインのプリコンパイルとは?
プリコンパイルは、複数のファイルをいっこにまとめて、圧縮して、ファイル名にフィンガープリント(ダイジェスト)をつけて、公開ディレクトリにデプロイする、などの作業と解釈してます。
プリコンパイルされていないアセットは、production環境では見ることができません。配信したいアセットがプリコンパイルの対象になっていることを確認する必要があります。
by Rails Asset Pipelineがうまくいかないときの問題の切り分けかた
自分が思っているProduction環境でのアセットパイプラインの流れ
1)コンパイル対象のファイル(デフォルトだとapplication.jsとapplication.css)を追加
追加することでパイプラインで生成されるファイルを増やすことができる。
2)アセット対象のパスを追加
追加することでコンパイル対象ファイル内に記述することができる。
3)パイプラインから生成されたファイルをstylesheet_link_tagやjavascript_include_tagで読み込む
アセット対象のパスを追加
config/initializers/assets.rb内
Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "images") Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "stylesheets") Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "javascripts")
指定したファイルをコンパイル対象にする
Rails.application.config.assets.precompile += %w( user.js admin.js user.css admin.css )
フォント系の問題
外部ライブラリのCSSファイル内で相対パスで書いてある場合、Production環境だと
CSSがapplication.cssに集約されるため、フォントが読み込めなくなる。
その場合は、「絶対パス」に変更するなどの対応が必要になる。
その他トラブルシューティング
作成されたアセットファイル群を消す方法
$ bundle exec rake assets:clobber
現在設定されているassetsのパス
$ bundle exec spring rails c $> Rails.application.config.assets.paths
プレコンパイル済みのアセットが配置されるディレクトリ
$ bundle exec spring rails c $> Rails.application.config.assets.prefix
application.cssやapplication.jsのようにプレコンパイル対象のファイルを新規に作成したい場合
以下参照。
[Ruby入門 Rails5編] 05. アセットパイプラインでフロントエンドのリソースを管理する
[参考]
Rails Asset Pipelineがうまくいかないときの問題の切り分けかた
【備忘録】nginx, Rails連携時にassets配下のファイルにアクセスできない場合の解決方法