How to reference images in CSS within Rails 4
Heroku上的Rails 4有一个奇怪的问题。在编译图像时,它们添加了哈希值,但是在CSS中对这些文件的引用没有调整正确的名称。这就是我的意思。我有一个名为logo.png的文件。然而,当它出现在Heroku上时,人们认为它是:
1 | /assets/logo-200a00a193ed5e297bb09ddd96afb953.png |
然而,CSS仍声明:
1 | background-image:url("./logo.png"); |
结果:图像不显示。有人碰到这个吗?如何解决这个问题?
链轮和SASS有一些漂亮的助手,你可以用来完成工作。如果样式表文件扩展名是
图像特定帮助程序:
1 | background-image: image-url("logo.png") |
不可知论助手:
1 2 | background-image: asset-url("logo.png", image) background-image: asset-url($asset, $asset-type) |
或者,如果要将图像数据嵌入到CSS文件中:
1 | background-image: asset-data-url("logo.png") |
不知道为什么,但唯一对我有用的是使用资产路径而不是图像路径,即使我的图像位于资产/图像/目录下:
例子:
1 | app/assets/images/mypic.png |
露比:
1 | asset_path('mypic.png') |
SCS:
1 | url(asset-path('mypic.png')) |
更新:
结果发现这些资产帮助器来自sass rails gem(我在项目中安装的)。
在Rails 4中,您可以轻松地引用位于
1 2 3 | .some-div { background-image: url(image-path('pretty-background-image.jpg')); } |
当以开发模式(
1 | background-image: url("/assets/pretty-background-image.jpg"); |
在生产模式下,您的资产将具有缓存帮助程序编号:
1 | background-image: url("/assets/pretty-background-image-8b313354987c309e3cd76eabdb376c1e.jpg"); |
散列是因为资产管道和服务器优化了缓存http://guides.rubyonrails.org/asset_pipeline.html网站
尝试如下操作:
1 | background-image: url(image_path('check.png')); |
古德拉克
在CSS中
1 | background: url("/assets/banner.jpg"); |
虽然原始路径是/assets/images/banner.jpg,但是按照惯例,您必须在url方法中只添加/assets/。
所有的答案都没有提到如何使用
2.3.1 CSS和ERB
资产管道自动评估erb。这意味着,如果向CSS资产添加erb扩展(例如,
1 | .class { background-image: url(<%= asset_path 'image.png' %>) } |
这将写入正在引用的特定资产的路径。在本例中,在其中一个资产加载路径(如
如果要使用数据URI(一种直接将图像数据嵌入到CSS文件中的方法),可以使用
1 | .logo { background: url(<%= asset_data_uri 'logo.png' %>) } |
这会将格式正确的数据URI插入到CSS源中。
请注意,结束标记的样式不能为-%>。
只有这段代码不适用于我:
1 | background-image: url(image_path('transparent_2x2.png')); |
但将stylename.scss重命名为stylename.css.scss有助于我。
参考Rails文档,我们发现有几种方法可以从CSS链接到图像。只需进入第2.3.2节。
首先,如果您的css文件是s a s s文件,请确保它具有.s css扩展名。
接下来,您可以使用Ruby方法,它非常难看:
1 | #logo { background: url(<%= asset_data_uri 'logo.png' %>) } |
或者您可以使用更好的特定形式:
1 2 | image-url("rails.png") returns url(/assets/rails.png) image-path("rails.png") returns"/assets/rails.png" |
最后,您可以使用常规表单:
1 2 | asset-url("rails.png") returns url(/assets/rails.png) asset-path("rails.png") returns"/assets/rails.png" |
经过数小时的处理,我发现了:
作品:
1 2 3 | background-image: url(image_path('transparent_2x2.png')); // how to add attributes like repeat, center, fixed? |
以上输出类似:
注意前面的"/",它在引号内。还要注意在yourstylesheet.css.scss中的scss扩展名和image_path helper。图像在app/assets/images目录中。
不起作用:
1 | background: url(image_path('transparent_2x2.png') repeat center center fixed; |
不起作用,属性无效:
1 | background:url(/assets/pretty_photo/default/sprite.png) 2px 1px repeat center fixed; |
我的最后一个办法是把它们放在我的公共S3桶里,然后从那里装起来,但最终还是有了一些进展。
在某些情况下,以下内容也适用
logo background:url(<%=asset_data_uri'logo.png%>)来源:http://guides.rubyonrails.org/asset_pipeline.html
有趣的是,如果我使用"背景图像",它不起作用:
1 | background-image: url('picture.png'); |
但只是"背景",它是:
1 | background: url('picture.png'); |
默认情况下,Rails 4不会为您的资产提供服务。要启用此功能,您需要进入config/application.rb并添加此行:
1 | config.serve_static_assets = true |
https://devcenter.heroku.com/articles/rails-4-asset-pipeline服务资产
你可以添加到你的css.erb扩展中。EJ:样式.css.erb
然后你可以把:
1 | background: url(<%= asset_path 'logo.png' %>) no-repeat; |
在Rails 4中,只需使用
background-image: url("picture.jpg");
}
这对我很有用:
1 | background: #4C2516 url('imagename.png') repeat-y 0 0; |
每次都能到那里。
1 | background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>); |