【问题标题】:Rails4: image_url not generating digest in scssRails4:image_url 未在 scss 中生成摘要
【发布时间】:2014-03-06 05:16:13
【问题描述】:

我不明白为什么我的 css 文件没有使用辅助方法 image_url 将摘要附加到我的资产中

我的资产已正确预编译,并且文件确实包含摘要。我也可以手动访问它们(使用摘要的 url)。最奇怪的是,一开始它是有效的。

这是我的配置:

  config.assets.js_compressor = :uglifier
  config.assets.compile = false
  config.assets.digest = true
  config.assets.version = '1.0'
  config.serve_static_assets = false #also tried true

这是我的 application.css: *= 要求树。

这是 common.scss 文件,用于包含图像:

body{
    background: image_url('bg.jpg');
    font-family: 'Lato', sans-serif;
    overflow-x: hidden;
}

图像以及样式表位于 assets/images 和 assets/stylesheets 内的子文件夹中。

这里是我的宝石:

gem 'rails', '4.0.0'
gem 'sass-rails', '~> 4.0.0'

我正在使用 capistrano 进行部署,但我不认为这是与 capistrano 相关的问题,资产编译得很好。

编辑 到目前为止我(未成功)尝试过的内容:

image-url('image.jpg'); -> http://www.mydomain.it/images/image.jpg
image_url('image.jpg');    -> same as above
url(image-path('header.jpg'));  -> http://www.mydomain.it/images/image.jpg
asset-url('image.jpg', image); -> http://www.mydomain.it/image.jpg

问题仍然存在:资产已编译但请求时没有摘要。

编辑

按照这个问题Rails 4 image-path, image-url and asset-url no longer work in SCSS files 我移动了我的资产并使用了 资产 url 并将我的资产放在 /public 文件夹中,背景图像正在工作,即使问题仍然存在,因为应用程序没有使用图像的时间戳版本。 所以只有一个(不是那么好,也不是那么糟糕)的解决方法。

【问题讨论】:

  • 尝试一次asset_url.....代替image_url
  • 嗯,我这样称呼它image-url('whitey.png')你确定是image_url吗?
  • config.assets.enabled = true?
  • 来自 rails 指南:资产管道默认启用。可以在 config/application.rb 中禁用它,方法是将此行放在应用程序类定义中:config.assets.enabled = false,但也尝试过。当然没有成功:)
  • 您是否尝试过使用RAILS_ENV=production rake assets:precompile 编译资产,我在使用rake assets:precompile 时也遇到过类似的问题,即使用RAILS_ENV=development 时。虽然我猜想设置 config.assets.digest = true 应该启用这个...

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline


【解决方案1】:

应该使用asset_path。此外,它需要在 ERB 标签下运行,因为 SCSS 不编译asset_path。将common.scss 重命名为common.scss.erb

.body { background-image: url(<%= asset_path 'bg.jpg' %>) }

阅读更多here

【讨论】:

  • 您是在开发还是生产环境中运行?资产路径对开发没有影响。检查你的 Rails 环境。
  • 生产环境。注册apache+passenger
  • capistrano 在每次部署时都会重新启动服务器
  • assets: 再次预编译?
  • 所以这个答案实际上帮助了我:SCSS 预处理器没有正确检查引用的图像是否已附加哈希,因此它不能真正以这种方式使用。在 SCSS 预处理器解决这个问题之前,添加 ERB 预处理器来处理 SCSS。
【解决方案2】:

尝试将common.scss 更改为common.css.scss

阅读更多:http://guides.rubyonrails.org/asset_pipeline.html#preprocessing

另外,要向资产管道添加其他文件夹,请将以下内容添加到 config/environments/production.rb

config.assets.paths << Rails.root.join('app', 'assets', 'images')
config.assets.paths << Rails.root.join('app', 'assets', 'stylesheets')

【讨论】:

  • 资产预编译好,问题是image_url生成的路径。还尝试重命名样式表,但没有效果
【解决方案3】:

我正在使用它及其为我工作。 使用这种格式的文件 common.css.scss

.body 
{
    background:url(image_name.gif) no-repeat;
}

【讨论】:

    【解决方案4】:

    rails 不会为实际不存在的资产附加摘要,因此请确保图像已经存在于图像目录中。

    【讨论】:

    • 图像经过良好的预编译,放入 public/assets 文件夹,并带有适当的摘要。问题是样式表中生成的路径:它在错误的位置搜索未编译的资产
    【解决方案5】:

    需要考虑的一些事项:

    • 确保图像不是“gitignored”或其他东西
    • 确保同一张图片不在公用文件夹下
    • 确保与资产相关的 gem 直接在 Gemfile 中,而不是在 group: :production 下。这是新的 Rails 规范
    • 运行 rake assets:clobber 并删除包含 sass 缓存的 tmp 文件夹
    • 生产环境下手动运行RAILS_ENV=production rake assets:precompile,让我们知道public下生成的文件列表
    • 在开发模式下运行rake assets:precompile,它可以提供更多日志

    【讨论】:

      【解决方案6】:

      从此更改您的设置

      config.serve_static_assets = false #also tried true
      

      config.serve_static_assets = true
      

      原因:您现在允许从您的应用调用/提供您的资产。之前你不是,它目前直接由你的服务器提供服务,即apachengnix

      我不相信这是怎么可能的

      image-url('image.jpg'); -> http://www.mydomain.it/images/image.jpg
      image_url('image.jpg');    -> same as above
      url(image-path('header.jpg'));  -> http://www.mydomain.it/images/image.jpg
      asset-url('image.jpg', image); -> http://www.mydomain.it/image.jpg
      

      它应该包含assets 代替images。如果是这种情况,除了资产管道之外还有其他事情发生。


      自从上次我的问题没有帮助,所以我想向您展示正在运行的应用程序,我创建了 heroku 应用程序(代码托管在 github 上)。您可以检查所有提交。它是专门为这个问题做的。最后的解决方法是这样。

      最终修复:https://github.com/passion8/so2_fix/commit/64acc654d8926098ec5a40579f4a0e005037e381

      Heroku 网址:https://vast-plains-3919.herokuapp.com/

      Github 代码:https://github.com/passion8/so2_fix

      Github 提交:https://github.com/passion8/so2_fix/commits/master

      如果还是不行,请看

      https://stackoverflow.com/a/25511960/1377943

      【讨论】:

        【解决方案7】:

        我在这里遇到同样的问题,我通过 Base 64 使用内联图像修复了它

        asset-data-url("images/image.jpg")

        【讨论】:

          【解决方案8】:

          在 .scss 的情况下使用 image-url,因为 image_url 适用于 .erb 文件。

          【讨论】:

            【解决方案9】:

            将文件名从.css 更改为.css.erb 并使用asset_url

            background-image: url(<%= asset_url('x-icon.png')  %>);
            

            或者你可以使用 scss 来做

            background-image: url(asset-path('x-icon.png'));
            

            不要在路径中包含“资产”,即不是"assets/x-icon.png",这不起作用。

            要在本地进行测试,请确保您的资产配置模仿生产环境,例如

                  config.public_file_server.enabled  =  true      
                  config.assets.compile              =  true
                  config.assets.digest               =  true
            

            或者,如果您从生产环境开始,请确保 config.public_file_server.enabled = true 以便 public 目录由 Rails 提供服务,通常它将由 Apache 或类似服务提供。

            • Rails 5.1

            【讨论】:

            • 酷。在 Rails 5.2 上工作。
            猜你喜欢
            • 1970-01-01
            • 2020-08-22
            • 1970-01-01
            • 2012-01-16
            • 1970-01-01
            • 1970-01-01
            • 2013-05-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多