エレガントなRailsのような方法を見つけました。まず、.scss
ファイルの名前をに変更し、次の.scss.erb
ような構文を使用します(highlight_js-rails4 gem CSSアセットの例):
@import "<%= asset_path("highlight_js/github") %>";
SCSSを介してファイルを直接ホストできない理由:
こう@import
SCSSでは、長い間、あなたが明示的に完全なパス一つの方法または別のものを使用してのようにCSSファイルの罰金に動作します。開発モードでrails s
は、コンパイルせずにアセットを提供するため、このようなパスは機能します...
@import "highlight_js/github.css";
...ホストされたパスが文字通りであるため/assets/highlight_js/github.css
。ページを右クリックして「ソースを表示」し、上記のスタイルシートのリンクをクリックすると、@import
次のような行が表示されます。
@import url(highlight_js/github.css);
SCSSエンジンはに変換さ"highlight_js/github.css"
れurl(highlight_js/github.css)
ます。これは、アセットがプリコンパイルされている運用環境で実行しようとするまで、ファイル名にハッシュが挿入された状態でうまくいきます。SCSSファイルは、/assets/highlight_js/github.css
プリコンパイルされておらず、本番環境には存在しないstaticに解決されます。
このソリューションの仕組み:
まず、.scss
ファイルを.scss.erb
に移動することにより、SCSSを効果的にRailsのテンプレートに変換しました。これで、<%= ... %>
テンプレートタグを使用するたびに、Railsテンプレートプロセッサがこれらのスニペットをコードの出力に置き換えます(他のテンプレートと同様)。
明記asset_path("highlight_js/github")
して.scss.erb
ファイルには、2つのことを行います。
rake assets:precompile
適切なCSSファイルをプリコンパイルするタスクをトリガーします。
- Rails環境に関係なく、アセットを適切に反映するURLを生成します。
これは、SCSSエンジンがCSSファイルを解析していないことも意味します。それへのリンクをホストしているだけです!したがって、Hokey Monkeyパッチや大まかな回避策はありません。意図したとおりにSCSS経由でCSSアセットを提供し、Railsが意図したとおりに、そのCSSアセットへのURLを使用しています。甘い!