我正在更新 Rails 3 应用程序以使用 Rails 3.1,作为其中的一部分,我正在使用新的资产管道。到目前为止,除了一个我无法解决的相当烦人的问题之外,我已经完成了所有工作。
该应用程序及其所有资产在开发中运行良好,但在生产中使用Passenger ( ) 将其部署到子URI http://the-host/sub-uri/
。这样做的问题是资产是在部署期间预编译的,我的一个 CSS(嗯,它是一个.css.scss
文件)文件正在使用gem中的image-url
帮助程序。sass-rails
由于在预编译过程中,路径被硬编码到预编译的 CSS 文件中,因此不考虑 sub-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); }
这种情况是不是要求太多了?如果是这样,我将不得不切换回旧的非资产流水线方式,只提供来自public
. 然而,这似乎是应该考虑和解决的事情......?我错过了解决方案吗?
编辑 1:我应该注意,使用erb 解决方案会产生相同的结果,正如人们所期望的那样。
编辑 2:回应 Benoit Garret 的评论
不,问题与config.assets.prefix
. 我尝试将其设置为(/sub-uri/assets
而不是默认值/assets
),但事实证明这是错误的做法 - 似乎此设置已经与 Rails 应用程序的根目录相关,而不是服务器。删除它(并因此返回默认值)修复了所有导致的奇怪问题(并且有很多,所有资产最终都进入了/sub-uri/sub-uri/assets
- 这一切都非常奇怪)。唯一的问题是image-url
helper 和朋友在预编译时不会拾取 sub-URI。不用说,这是合乎逻辑的,因为当它被预编译时,它不可能知道当它在Passenger下运行时,它会这样配置。我的问题是如何通知它,从而在预编译结果中得到正确的路径。如果确实可以做到。
我当前的解决方法是像这样在 CSS 中引用 iamge:url(../images/bg.png)
并将其放置在非流水线public/images
位置。几乎不理想,因为它不能从指纹和管道提供的一切中受益。