我在Rails 3.1应用程序(3.1.0.rc8)中没有出现在生产模式中的背景图像存在问题。我也使用链轮2.0.0和乘客3.0.8。
我的样式表是.scss,并在背景部分使用image_tag('...')。当我部署时,我正在预编译资产。
我的生产服务器正在将Apache2与Passenger一起使用,并将应用程序部署到子URI。虚拟主机定义为:
ServerName wibble
DocumentRoot /srv/www
...
RailsBaseURI /myapp
<Directory /srv/www/myapp>
Options -MultiViews
</Directory>
该应用程序实际部署到/ srv / applications / myapp,我已经创建了一个从/ srv / www / myapp到/ srv / applications / myapp / current / public的符号链接。
样式表正在正确提供,但当我检查徽标的元素时,它会出现:
url("http://wibble/assets/logo-xxx.png")
intead of:
url("http://wibble/myapp/assets/logo-xxx.png")
实际上,如果我在Opera中使用编辑声明更改上面的URL,它确实会正确显示徽标。这告诉我,我正确地引用了图像,并且正确地进行了预编译。实际的样式表很好,所以我也正确地拿起资产。看起来好像RailsBaseURI错过了url路径。
我在样式表中尝试了各种各样的方法 - 使用.erb,asset_path,/ myapp / logo.png,myapp / logo.png - 并且没有任何效果。使用瘦服务器在开发模式下一切正常。
非常感谢任何帮助。
答案 0 :(得分:1)
如果我部署到子URI,我只找到一种方法,用于引用资产管道中的CSS文件中的图像。所以如果我在资产管道中有以下CSS:
div{background: transparent url('../images/logo.png') no-repeat top left;}
然后将图像放在public / images / logo.png。尝试使用SCSS image_url帮助程序似乎总是希望将资产放在根目录(“/ assets”)。
将图像放在公共工程中的旧位置,但它会将logo.png文件从资产管道中取出,而不会给它提供摘要以使其正常到期。
答案 1 :(得分:1)
最后,我想出了几个解决方案。
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
2)或者,如果可以在CSS中嵌入图像,将样式表更改为具有.erb扩展名,并将image-url('logo.png')
替换为url(<%= asset_data_uri 'logo.png' %>)
,则无需更改sass-rails
答案 2 :(得分:0)
您是否尝试过asset_path而不是image_tag?
同样,请在您的production.rb文件中注意这一点:
config.action_dispatch.x_sendfile_header =“X-Sendfile”#对nginx使用'X-Accel-Redirect'
安装apache后,您可能需要对其进行评论。