【Rails】画像ファイルの相対パスと絶対パス【画像が見えない(´・ω・`;)】
先日、
クライアント側でJavaScriptを実行する時にちょぴっとハマった現象。
サンプルではJQueryを使っていますが、JavaScriptでも全く同じ(´・ω・`;)
[route.rb]
resources :hoges do get :fuga, :on => :collection end
[View(というかhtml)]
<html> <head> <title>yukkurisan</title> <script src="/javascripts/jquery-1.6.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function(){ $("div.hoge").eq(0).css("background-image", "url('../images/yukkuri.png')"); }); </script> </head> <body> <div class="hoge"> </div> ・・・・(1) </body> </html>
要は、htmlがロードされたら(1)の背景にyukkuri.pngが読み込まれるというだけの処理。
テストしていた時には、
**yukkuri**/hoges/fuga
といつもの通りアクセスし、プログラムに問題がないことを確認していたのですが、
とある静的リンクからたどってきた場合に「画像だけが表示されない」現象に遭遇(´・ω・`;)
なんのせいかすぐはわからなかったのですが、じきに解決。
その理由はというと、、
叩かれたURLが、
**yukkurisan**/hoges/fuga/
となっていたことが原因でした・・orz
つまりです、
この場合、railsにしてみれば、
**yukkurisan**/hoges/fuga も
**yukkurisan**/hoges/fuga/ も
同じルーティングを指すのですが、
viewに書かれたjavascriptからすると、このルーティングの違いはとても重要で、
特に相対パスの場合は、「今いる階層からみたパス」なので、/ のあるなしは非常に重要なのです。。
../images/yukkuri.png は、
一つ上の階層のimagesディレクトリの(ry
というわけなので、
/ なしの場合、hogesの並びのimagesディレクトリ以下のyukkuri.png
/ ありの場合、fugaの並びのimagesディレクトリ以下のyukkuri.png
を指すという・・
結局、ここにくるための静的リンクは変えられないし、
内部的にもfuga_hoges_pathといたるところで使っているので、
仕方がないので、相対パスはやめて、
/images/yukkuri.png
と全て絶対パスに置換しました。。・x・;
ま。最初から絶対パスにしておけば何事もなかったんですがね・・