Mar*_*ing 8 assets passenger ruby-on-rails-3.1 sprockets asset-pipeline
我正在更新Rails 3应用程序以使用Rails 3.1,作为其中的一部分,我正在利用新的资产管道.到目前为止,我已经把一切都解决了一个我无法解决的相当恼人的问题.
应用程序及其所有资产在开发中运行良好,但在生产中,它使用Passenger(http://the-host/sub-uri/)部署到子URI .这个问题是资产是在部署期间预编译的,我的一个CSS(好吧,它是一个.css.scss文件)文件正在利用gem 中的image-url帮助程序sass-rails.由于在预编译过程中,路径被硬编码到预编译的CSS文件中,因此不考虑子uri:
在我的.css.scss档案中:
body { background-image: image-url("bg.png"); }
Run Code Online (Sandbox Code Playgroud)
编译application-<md5-hash-here>.css文件中的结果:
body { background-image: url(/assets/bg.png); }
Run Code Online (Sandbox Code Playgroud)
它应该是什么使它正常工作:
body { background-image: url(/sub-uri/assets/bg.png); }
Run Code Online (Sandbox Code Playgroud)
这个场景只是要求太多了吗?如果是这样,我将不得不切换回旧的非资产流水线方式,只需提供我的图像和CSS public.然而它似乎应该被考虑和解决的东西......?我错过了解决方案吗?
编辑1:我应该注意,使用erb解决方案会产生与预期相同的结果.
编辑2:回应Benoit Garret的评论
不,问题与此无关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位置.很难理想,因为它不会受益于指纹和管道提供的一切.
小智 4
最后我想出了一些解决方法/解决方案。
1)从https://github.com/rails/sass-rails/issues/17看来,这可以在sass-rails中得到修复。我自己按照上面链接中建议的补丁的方式对 helpers.rb 进行了猴子补丁。我只是在deploy.rb.
我在一个文件中完成所有的猴子修补config/initializers/gem_patches.rb。在此文件中,我将此方法修补为:
module Sass
module Rails
module Helpers
protected
def public_path(asset, kind)
path = options[:custom][:resolver].public_path(asset, kind.pluralize)
path = ENV['PRODUCTION_URI'] + path if ENV['PRODUCTION_URI']
path
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
2) 或者,如果您可以在 CSS 中嵌入图像,则将样式表更改为具有 .erb 扩展名,然后将其替换为image-url("bg.png")即可url(<%= asset_data_uri "bg.png" %>),无需更改 sass-rails。 asset-data-uri不作为纯 Sass 函数存在,因此您必须使用 Rails helper asset_data_uri。
| 归档时间: |
|
| 查看次数: |
6713 次 |
| 最近记录: |