Rails 3.1アセットパイプラインがうまく機能するプロジェクト。問題は、Sassで画像を参照する必要があることですが、Railsは画像URLを計算します。 (Railsは画像のGitハッシュをファイル名に追加してキャッシュを無効にします。)
たとえば、app/assets/stylesheets/todos.css.scss
で:
.button.checkable { background-image: url(/assets/tick.png); }
デプロイ(またはrake assets:precompile
を実行)すると、ファイルapp/assets/images/tick.png
はpublic/assets/tick-48fe85c0a.png
または類似のものに移動します。これはCSSを破壊します。 この投稿 は2つの提案をします。
public/images/
に入れて直接参照してください番号1は確かに可能性がありますが、画像のキャッシュを無効にしないことを意味します。ファイルを処理するためにERBではなくSassを使用しているため、2番が出ています。
以下はトリックを実行する必要があります。
.button.checkable { background-image: url(image_path('tick.png')); }
実際、Railsは、アセットを参照するための多数のヘルパーを提供します。
image-url('asset_name')
audio-path('asset_name')
一般に
[asset_type]-url('asset_name') #Becomes url('assets/asset_name')
[asset_type]-path('asset_name') #Becomes 'assets/asset_name'
asset_typeは、画像、フォント、ビデオ、オーディオ、javascript、スタイルシートのいずれかです。
sass-Rails gemは、ERB処理なしでSassから使用できるSass関数を定義します。 https://github.com/Rails/sass-Rails
ユーザーの読み込み時間を短縮したい場合は、base64のCSSに画像を読み込むためのSteve Soudersのヒントを参考にしてください。
asset-data-url( 'path')
オプション2のバリアントが機能します。このようなものがある場合:
app/assets/stylesheets/pancakes_house.css.less.erb
そして、require
それをapplication.css
ファイルに入れます。次に、pancakes_house
が最初にERBを通過し、その出力がLESSプロセッサを通過し、そこから出力されるものはすべてCSSに送られます。 SCSS内にERBを配置することは少し奇妙に感じるかもしれませんが、それはうまくいき、あまり奇妙にならずに作業を完了します。
したがって、ERBを介してキャッシュバスティングイメージパスを生成するために必要な方法を取得できるはずです。
Lessファイルでこれを試しましたが、.css.scss.erb
でも動作するはずです。
余談ですが、 SASSに独自の関数 を追加することもできます:
このモジュールのメソッドには、SassScriptコンテキストからアクセスできます。たとえば、次のように書くことができます
$color = hsl(120deg, 100%, 50%)
そして、
Sass::Script::Functions#hsl
を呼び出します。
いくつかの 独自の関数の作成に関する指示 がマニュアルのさらに下にあります。ただし、スプロケットにSass::Script::Functions
パッチをロードする方法がわからないので、これを実用的なソリューションとは言えません。私よりも強力なSprocket Fuを持っている人は、このアプローチを機能させることができるかもしれません。ERBifiedSCSSよりもエレガントだと思います。
番号2は簡単に使用できます。.erb
拡張子を.scss
ファイルに追加するだけです:
app/assets/stylesheets/todos.css.scss.erb
asset_path
メソッドを使用して、ハッシュ付きの画像へのパスを取得します。
.button.checkable { background-image: url('<%= asset_path 'tick.png' %>'); }
このファイルはerbで処理され、次にsassで処理されます。
アセットパイプラインを使用する場合、アセットへのパスを書き換える必要があり、sass-Railsは次のアセットクラスに-urlおよび-pathヘルパー(Sassではハイフンで、Rubyでは下線付き)を提供します:画像、フォント、ビデオ、オーディオ、JavaScriptおよびスタイルシート。
image-url( "Rails.png")はurl(/assets/Rails.png)を返しますimage-path( "Rails.png")は "/assets/Rails.png"を返します
より一般的な形式も使用できます。
asset-url( "Rails.png")はurl(/assets/Rails.png)を返しますasset-path( "Rails.png")は "/assets/Rails.png"を返します