【问题标题】:Background image not showing in Rails 3.1 production在 Rails 3.1 生产中未显示背景图像
【发布时间】:2011-11-07 02:23:09
【问题描述】:

在 Rails 3.1 应用程序 (3.1.0.rc8) 的生产模式下,我遇到了背景图像未显示的问题。我也在使用 sprockets 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")

代替:

url("http://wibble/myapp/assets/logo-xxx.png")

实际上,如果我在 Opera 中使用编辑声明更改 URL,它确实可以正确显示徽标。这表明我正确地引用了图像,并且它被正确地预编译。实际的样式表很好,所以我也正确地选择了资产。就好像 RailsBaseURI 错过了 url 路径。

我在样式表中尝试了各种方法——使用 .erb、asset_path、/myapp/logo.png、myapp/logo.png——但没有任何效果。在瘦服务器的开发模式下一切正常。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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 文件从资产管道中取出,在该管道中没有提供摘要以使其正确过期。

    【讨论】:

    • 谢谢杰森。我真的不喜欢这个解决方案,因为它阻止图像成为资产管道的一部分。我现在正在尝试确定 /assets 的放置位置,看看我是否删除了前导斜杠,然后乘客可以正确计算出带有子 URI 的 URL。
    • 我遇到了same problem 并得出了相同的结论。问题是没有办法告诉预编译过程它将在子 URI 下。当然,在预编译过程中,它只是运行一些代码,因此它不知道乘客或它将在其下运行的子 URI。疼痛。
    【解决方案2】:

    最后我想出了几个解决方案。

    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(&lt;%= asset_data_uri 'logo.png' %&gt;) 即可,无需更改 sass-rails。

    【讨论】:

    • 我也有同样的问题。我正在测试您的解决方案 2,希望这会奏效。可以肯定的是,您将 yourfile.css.scss 替换为 yourfile.css.erb ?
    • 我实际上使用了解决方案 1,但是要使用解决方案 2,请将 .css 更改为 .erb。如果您的样式表是真正的 sass 而不是纯 css,请小心,因为事情将停止工作。在我写这篇文章的时候,css 是 rails 样式表的标准。
    【解决方案3】:

    您是否尝试过asset_path 而不是image_tag?

    另外,请注意您的 production.rb 文件中的这一点:
    config.action_dispatch.x_sendfile_header = "X-Sendfile" # 为 nginx 使用 'X-Accel-Redirect'

    安装 apache 后,您可能需要将其注释掉。

    【讨论】:

    • 谢谢乔恩。我尝试了这两个,但仍然没有快乐。我现在开始认为这是我的 Apache/Passenger 设置中的东西,而不是 Rails 应用程序中的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2020-02-05
    • 2019-02-11
    相关资源
    最近更新 更多