如何在Rails 4中引用CSS中的图像


205

Heroku上的Rails 4有一个奇怪的问题。编译图像时,会在其中添加哈希值,但是CSS中对这些文件的引用未调整适当的名称。这就是我的意思。我有一个名为logo.png的文件。但是,当它出现在heroku上时,它被视为:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

但是CSS仍然指出:

background-image:url("./logo.png");

结果:图像不显示。有人碰到这个吗?如何解决?


1
仅供参考,Heroku已经确认这是一个错误……他们正在研究解决方案
Nick ONeill

您能对此进行更新吗?我遇到了同样的问题
Minh Danh,2016年

Answers:


392

链轮和Sass都有一些漂亮的助手,您可以用来完成工作。当您的样式表文件扩展名为.css.scss或时,Sprockets 才会处理这些帮助器.css.sass


图片专用助手:

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")

21
asset-data-url我在Rails 4应用程序中将.css文件更改为.css.scss文件后,对我有用。谢谢!
fatman13年

@ fatman13是的,据我所知,这仅适用于.scss和.sass文件。
zeeraw 2014年

杰夫:只要您的资产网址选项设置正确,其他人就可以工作。asset-data-url由于它会将整个文件嵌入样式表中,因此它不适用。
zeeraw

1
类似@ fatman13因为我用的是sass-rails我终于结束了添加文件扩展.scss至损坏的.css文件(S),使他们在全部结束.css.scss,再换下的所有实例url('blah.png')url(asset-path('blah.png'))(在我的情况下,所有blah.pngs是在一个/vendor版夹)。
likethesky

asset-url($asset)应该用于链轮3,该版本$asset-type可能适用于某些较旧的版本
prusswan

59

不知道为什么,但使用该工作对我来说唯一的事情就是asset_path 代替IMAGE_PATH,即使我的图像是在资产/图像/目录:

例:

app/assets/images/mypic.png

在Ruby中:

asset_path('mypic.png')

在.scss中:

url(asset-path('mypic.png'))

更新:

事实证明,这些资产助手来自sass-rails gem(我已经在项目中安装了它)。


2
为我工作,真的是非常好的Rails解决方案。感谢@Yarin
AMIC MING

1
是! 经过几个小时的努力,您的“资产路径”解决方案终于在我的.css.scss文件中为我工作了!background-image: url(asset-path('off.png'))
雷蒙德·甘

36

在Rails 4,你可以参考位于图像assets/images/在你的.SCSS文件很容易像这样:

.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");

1
@MikeLyons:刚刚在一个全新的Rails 4.1项目中对其进行了测试,并部署到了Heroku,它对我来说工作正常。你一定有感动production.rb
sergserg 2014年


11

在CSS

background: url("/assets/banner.jpg");

尽管原始路径是/assets/images/banner.jpg,但按照惯例,您必须在url方法中仅添加/ assets /


1
使用普通的ol CSS,我以为我疯了-谢谢!
Craig McGuff 2014年

2
这将不会在生产中进行编译
dimitry_n

哇,谢谢你,这不是很直观。所以我想在资产路径上的全部资产(vendor/assetsapp/assetslib/assets等)共同结合成一个单一的Assets文件夹讨人喜欢完成后?

这在生产环境中不起作用,因为在生产环境中,您的资产在名称末尾附加了MD5哈希值进行编译,并且在典型设置下/assets/banner.jpg不起作用。相反,它会像/assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpgTL; DR请勿使用。
约书亚·品特

10

没有答案能说明我何时进行.css.erb扩展时如何引用图像的方法。对我来说,也从事生产开发工作:

2.3.1 CSS和ERB

资产管道自动评估ERB。这意味着,如果您将erb扩展名添加到CSS资产(例如application.css.erb),则asset_pathCSS规则中将提供类似helper的帮助:

.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源。

请注意,结束标记不能为-%>样式。


5

仅此代码段对我不起作用:

background-image: url(image_path('transparent_2x2.png'));

但是将stylename.scss重命名为stylename.css.scss可以帮助我。


4

参考Rails文档,我们看到有几种方法可以链接到CSS中的图像。只需转到第2.3.2节。

首先,如果您的css文件是sass文件,请确保其扩展名为.scss。

接下来,您可以使用ruby方法,这确实很难看:

#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"

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帮助器。该图像位于app / assets / images目录中

不起作用:

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存储桶中并从那里加载,但最终有了进展。


对于来这里仍然遇到麻烦的任何人:确保您的css文件已更新,并且尚未在本地预编译资产,并且忘记了对其进行更新。
Hartwig 2014年

哈特维格-这是什么意思?您是否意味着必须重新运行预编译才能使用此方法?我已经尝试了这篇文章中建议的所有内容(所有内容),但对我没有任何帮助
梅尔(Mel)2016年

2

有趣的是,如果我使用“背景图像”,则无法使用:

background-image: url('picture.png');

但是只是“背景”,它可以:

background: url('picture.png');

但这只能从scss文件工作,而不能放在div中的样式属性分配中时...我感到困惑
AnderSon 2014年


1

当使用宝石“ sass-rails”时,在Rails 5,引导程序4中,以下对我有用:

在.scss文件中:

    background-image: url(asset_path("black_left_arrow.svg"));

在视图文件中(例如.html.slim):

    style=("background-image: url(#{ show_image_path("event_background.png") })");



0

在Rails 4中,只需使用

.hero { background-image: url("picture.jpg"); }

只要您将背景图片隐藏在app / assets / images中,就可以在您的style.css文件中添加。


阅读完整的问题
Adriano Resende'Mar

0

您可以添加到css .erb扩展名。Ej:style.css.erb

然后,您可以输入:

background: url(<%= asset_path 'logo.png' %>) no-repeat;

0

这为我工作:

background: #4C2516 url('imagename.png') repeat-y 0 0;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.