关于heroku:如何在Rails 4中引用CSS中的图像

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有一些漂亮的助手,你可以用来完成工作。如果样式表文件扩展名是.css.scss.css.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中,您可以轻松地引用位于assets/images/文件中的.SCSS文件中的图像,如下所示:

1
2
3
.some-div {
  background-image: url(image-path('pretty-background-image.jpg'));
}

当以开发模式(localhost:3000启动应用程序时,应该看到如下内容:

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/。


所有的答案都没有提到如何使用.css.erb扩展,如何引用图像。对我来说,在生产和开发方面都工作过:

2.3.1 CSS和ERB

资产管道自动评估erb。这意味着,如果向CSS资产添加erb扩展(例如,application.css.erb,那么类似asset_path的帮助程序在CSS规则中可用:

1
.class { background-image: url(<%= asset_path 'image.png' %>) }

这将写入正在引用的特定资产的路径。在本例中,在其中一个资产加载路径(如app/assets/images/image.png)中使用映像是有意义的,它将在此处引用。如果此图像在public/assets中已作为指纹文件提供,则会引用该路径。

如果要使用数据URI(一种直接将图像数据嵌入到CSS文件中的方法),可以使用asset_data_uri助手。

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?

以上输出类似:"/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

注意前面的"/",它在引号内。还要注意在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中,只需使用

.hero {
background-image: url("picture.jpg");
}
在style.css文件中,只要背景图像被塞进app/assets/images。


这对我很有用:

1
background: #4C2516 url('imagename.png') repeat-y 0 0;

每次都能到那里。

1
background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);