Rails3.1を使用するようにRails3アプリを更新している最中であり、その一環として、新しいアセットパイプラインを利用しています。これまでのところ、解決できないかなり厄介な問題を除けば、すべてが機能しています。
アプリケーションとそのすべてのアセットは、開発では正常に機能しますが、本番環境では、Passenger()を使用してサブURIにデプロイされhttp://the-host/sub-uri/
ます。これに伴う問題は、アセットがデプロイ中にプリコンパイルされ、CSS(まあ、それは.css.scss
ファイルです)ファイルの1つがgemのimage-url
ヘルパーを利用していることです。sass-rails
プリコンパイルプロセス中に、パスがプリコンパイルされたCSSファイルにハードコードされるため、サブURIは考慮されません。
私の.css.scss
ファイル:
body { background-image: image-url("bg.png"); }
コンパイルされたapplication-<md5-hash-here>.css
ファイルの結果:
body { background-image: url(/assets/bg.png); }
正しく機能させるにはどうすればよいですか。
body { background-image: url(/sub-uri/assets/bg.png); }
このシナリオは、質問が多すぎますか?もしそうなら、私は古い非アセットパイプラインの方法に切り替えて、からの画像とCSSを提供する必要がありpublic
ます。しかし、それは考えられて解決されるべきもののように思えます...?私は解決策を逃していますか?
編集1:代わりにerbソリューションを使用すると、予想どおり同じ結果が得られることに注意してください。
編集2:ブノワギャレットのコメントに応えて
いいえ、問題はに関連していませんconfig.assets.prefix
。私はそれを(/sub-uri/assets
デフォルトではなく/assets
)に設定しようとしましたが、それは間違ったことであることがわかりました-この設定はすでにサーバーではなくRailsアプリのルートに関連しているようです。それを削除する(したがってデフォルトに戻す)ことで、原因となったすべての奇妙な問題が修正されました(そして、多くの、すべてのアセットが最終的に作成されました/sub-uri/sub-uri/assets
-それはすべて非常に奇妙でした)。唯一の問題は、image-url
ヘルパーや友人は、プリコンパイルされたときにサブURIを取得しません。言うまでもなく、これは論理的です。プリコンパイルされている場合、Passengerで実行されているときに、このように構成されることを認識できなかった可能性があります。私の質問は、これをどのように通知するかであり、したがって、プリコンパイルされた結果に正しいパスが含まれることになります。確かにそれができるなら。
私の現在の回避策は、CSSでiamgeを次のように参照し、url(../images/bg.png)
パイプライン化されていない場所に配置することpublic/images
です。フィンガープリントやパイプラインが提供するすべてのものの恩恵を受けないため、ほとんど理想的ではありません。