Railsでアセットを使う場合、assets/
以下に入れておけば、Sprocketsが各種の処理を施していきます。それに気をつけないと、うまく動かないこともあります。
アセットのプリコンパイル
本番環境でアセットをプリコンパイルすると、
- CoffeeScriptやSassのコンパイル
- ファイル名へのダイジェスト付与
などのことが行われます。ということで、画像ファイルについてもそのままの名前では参照できなくなってしまいます。
image_path
ヘルパー関数
そんなわけで、変換後の名前で参照するためのimage_path
というヘルパー関数があります。これは、ERBなどのRubyコードに埋め込むためのものです。そして、Sassではimage-path
とCSS的な命名に変わって存在しています。
ただし、どちらもJavaScriptに対して直接使えるものではありません。
ERBで埋め込む?
もちろん、JavaScriptを.js.erb
のような拡張子にしてERB処理させれば、いちおう使うことはできます。ただし、
$(function(){
$('#some_img').attr('src',"<%= image_path('path/to/some.png') %>")
});
というように、きわめて読み書きしづらくなってしまいます。
1ファイルだけに収める
さすがにこんなファイルで溢れかえると収拾がつかなくなるので、image_path
関数をJavaScript側に出現させるファイルを作って、残りはそこを呼ぶことにします。
<%
imgs = {}
Dir.chdir("#{Rails.root}/app/assets/images/") do
imgs = Dir["**/*"].inject({}) do |h,f|
h.merge!(f => image_path(f)) unless Dir.exist? f
h
end
end
%>
window.image_path = function(name){
return <%= imgs.to_json %>[name];
}
このようにすることで、他のファイルではJavaScriptの関数としてimage_path
を呼べます。
外部リンク
なお、ここのコードに対してディレクトリ階層に対応するなど、多少を手を入れた形となっています。