在Heroku上,Rails 4存在一个奇怪的问题。当图像被编译时,它们会添加哈希值,但是在CSS中对这些文件的引用没有正确地调整名称。我是这个意思。我有一个名为logo.png的文件。但是当它出现在Heroku上时,它被视为:
/assets/logo-200a00a193ed5e297bb09ddd96afb953.png
然而CSS仍然声明:
background-image:url("./logo.png");
结果是:图片没有显示。有人遇到过这种情况吗?如何解决?
在Heroku上,Rails 4存在一个奇怪的问题。当图像被编译时,它们会添加哈希值,但是在CSS中对这些文件的引用没有正确地调整名称。我是这个意思。我有一个名为logo.png的文件。但是当它出现在Heroku上时,它被视为:
/assets/logo-200a00a193ed5e297bb09ddd96afb953.png
background-image:url("./logo.png");
Sprockets与Sass一起提供了一些实用的辅助功能,可以帮助您完成工作。只有当您的样式表文件扩展名为.css.scss
或.css.sass
时,Sprockets才会处理这些辅助功能。单击此处了解更多信息。
特定于图像的辅助功能:
background-image: image-url("logo.png")
不可知论者助手:
background-image: asset-url("logo.png", image)
background-image: asset-url($asset, $asset-type)
如果您想在css文件中嵌入图像数据:background-image: asset-data-url("logo.png")
asset-data-url
对我有用。谢谢! - fatman13sass-rails
,最终我添加了文件扩展名.scss
到有问题的.css文件中,以便它们都以.css.scss
结尾,然后将所有url('blah.png')
的实例替换为url(asset-path('blah.png'))
(在我的情况下,所有的blah.png都在一个/vendor
文件夹中)。 - liketheskyasset-url($asset)
应该用于 Sprockets 3,带 $asset-type
的版本可能适用于一些旧版本。 - prusswanimage-url
相对于 asset-url
有什么好处? - Joshua Pinter不知道为什么,但对我起作用的唯一方法是使用asset_path而不是image_path,即使我的图像位于assets/images/目录下:
示例:
app/assets/images/mypic.png
在 Ruby 中:
asset_path('mypic.png')
在 .scss 文件中:
url(asset-path('mypic.png'))
更新:
找到解决方法- 结果发现这些资产助手来自sass-rails宝石(我已将其安装在我的项目中)。
background-image: url(asset-path('off.png'))
- Raymond Gansass-rails
gem。这些helpers已经可以直接使用了。 - Promise Preston在Rails 4中,您可以轻松地在.SCSS
文件中引用位于assets/images/
的图像,如下所示:
.some-div {
background-image: url(image-path('pretty-background-image.jpg'));
}
当你以开发模式启动应用程序(localhost:3000
)时,你应该看到类似于:
background-image: url("/assets/pretty-background-image.jpg");
在生产模式下,您的资产将具有缓存辅助数字:background-image: url("/assets/pretty-background-image-8b313354987c309e3cd76eabdb376c1e.jpg");
production.rb
上做了什么。 - sergserg哈希是因为资产管道和服务器优化缓存
http://guides.rubyonrails.org/asset_pipeline.html尝试像这样:
background-image: url(image_path('check.png'));
祝你好运
.css
对我来说不起作用。 - Arup Rakshit在 CSS 中
background: url("/assets/banner.jpg");
尽管原始路径为/assets/images/banner.jpg,但按照惯例,在url方法中只需添加/assets/。
vendor/assets
、app/assets
、lib/assets
等)中的资产在预处理完成后都会合并到一个单独的资产文件夹中? - ohhh/assets/banner.jpg
将无法正常运行。相反,它会变成类似于/assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg
的东西。 简而言之,请不要使用这个方法。 - Joshua Pinter没有一个答案提到了我在使用 .css.erb
后缀时如何引用 图片。对我而言,在开发环境和生产环境中都可以起作用:
资产管道会自动评估ERB。这意味着如果您将erb扩展名添加到CSS资产(例如application.css.erb
),则可以在CSS规则中使用asset_path
等帮助程序:
.class { background-image: url(<%= asset_path 'image.png' %>) }
此代码将写入引用的特定资源的路径。在此示例中,应该在资产加载路径之一中有一张图片,例如 app/assets/images/image.png
,将在此处引用。如果此图像已经作为指纹文件可在 public/assets
中使用,则引用该路径。
如果您想要使用数据 URI - 将图像数据直接嵌入到CSS文件中的方法 - 您可以使用 asset_data_uri
帮助程序。
.logo { background: url(<%= asset_data_uri 'logo.png' %>) }
这会将正确格式的数据URI插入到CSS源代码中。
请注意,结束标签不能是样式为 -%> 的形式。
只有这段代码对我不起作用:
background-image: url(image_path('transparent_2x2.png'));
#logo { background: url(<%= asset_data_uri 'logo.png' %>) }
image-url("rails.png") returns url(/assets/rails.png)
image-path("rails.png") returns "/assets/rails.png"
asset-url("rails.png") returns url(/assets/rails.png)
asset-path("rails.png") returns "/assets/rails.png"
background-image: url(image_path('transparent_2x2.png'));
// how to add attributes like repeat, center, fixed?
"/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"
。background: url(image_path('transparent_2x2.png') repeat center center fixed;
无法工作,属性无效:
background:url(/assets/pretty_photo/default/sprite.png) 2px 1px repeat center fixed;
我的最后一招是将它们放在公共的S3存储桶中,并从那里加载,但最终我成功了。
background-image: url('picture.png');
background: url('picture.png');