背景图像没有显示在Rails 3.1生产中

时间:2011-08-30 19:24:55

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我在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 - 并且没有任何效果。使用瘦服务器在开发模式下一切正常。

非常感谢任何帮助。

3 个答案:

答案 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后,您可能需要对其进行评论。