Rails:image_url不在scss中生成摘要

时间:2014-02-08 19:21:10

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

我无法理解为什么我的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 '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我移动了我的资产并使用了组合 asset-url并将我的资产放在/ public文件夹中,背景图像正常工作,即使问题仍然存在,因为应用程序未使用图像的带时间戳的版本。 所以只有一个(不是好的,也不是坏的)解决方法。

9 个答案:

答案 0 :(得分:4)

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

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

了解更多here

答案 1 :(得分:2)

需要考虑的一些事项:

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

答案 2 :(得分:1)

从此

更改您的设置
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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我在这里遇到同样的问题,我用Base 64修复了它,使用

内联图像
  

资产数据-URL(&#34;图像/ image.jpg的&#34)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

将文件名从.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