Rails4:image_url不在scss中生成摘要

我无法理解为什么我的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:* = require_tree。

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

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

图像以及样式表位于资产/图像和资产/样式表中的子文件夹中。

在这里我的gem:

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

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

编辑到目前为止我(尝试失败)的尝试:

 image-url('image.jpg'); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg image_url('image.jpg'); -> same as above url(image-path('header.jpg')); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg asset-url('image.jpg', image); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg 

问题仍然存在:资产已编译但未经摘要请求。

编辑

关注这个问题Rails 4 image-path,image-url和asset-url不再适用于SCSS文件我移动了我的资产并使用asset-url的组合并将我的资产放在/ public文件夹中,背景图像正常工作,甚至虽然问题仍然存在,因为应用程序没有使用图像的带时间戳的版本。 所以只有一个(不是好的,也不是坏的)解决方法。

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

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

在这里阅读更多。

有些事情需要考虑:

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

从此更改您的设置

 config.serve_static_assets = false #also tried true 

 config.serve_static_assets = true 

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

我不相信这是可能的

 image-url('image.jpg'); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg image_url('image.jpg'); -> same as above url(image-path('header.jpg')); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg asset-url('image.jpg', image); -> http://sofzh.miximages.com/ruby-on-rails/image.jpg 

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


从上次我的问题没有帮助,所以我想给你看工作的应用程序,我已经创建了heroku应用程序(代码托管在github上)。 您可以检查所有提交。 它专门为这个问题而做。 最后的解决方法就是这样。

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

Herokuurl: 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

尝试将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') 

我正在使用它和它为我工作。 使用此格式为common.css.scss的文件

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

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

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

资产数据-URL( “图像/ image.jpg的”)

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

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

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

或者你可以使用scss和do

 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