使用Rails 3.1时如何在Sass中使用参考图像?

我有一个Rails 3.1项目,资产管道运行良好。问题是我需要在Sass中引用图像,但是Rails会计算图像URL。(这在生产中尤为重要,Rails在生产中将图像的Git哈希值附加到其文件名中以将其添加到胸围缓存中。)

例如,在app/assets/stylesheets/todos.css.scss

.button.checkable { background-image: url(/assets/tick.png); }

当我部署(或运行rake assets:precompile)时,文件app/assets/images/tick.png将移至public/assets/tick-48fe85c0a.png或类似位置。这会破坏CSS。这篇文章提出了两个建议:

  1. 不要将资产管道用于图像-而是将其放入public/images/并直接引用
  2. 在您的CSS中使用ERB,并让Rails计算出图像URL。

1号肯定是有可能的,尽管这意味着我的图像上没有缓存损坏。2号出局是因为我使用的是Sass,而不是ERB来处理文件。

古一逆天2020/03/19 09:54:48

使用资产管道时,必须重新编写资产路径,并且sass-rails为以下资产类别提供-url和-path帮助器(在Sass中连字符,在Ruby中强调):图像,字体,视频,音频,JavaScript和样式表。

image-url(“ rails.png”)返回url(/assets/rails.png)image-path(“ rails.png”)返回“ /assets/rails.png”

也可以使用更通用的形式:

asset-url(“ rails.png”)返回url(/assets/rails.png)asset-path(“ rails.png”)返回“ /assets/rails.png”

神无小哥2020/03/19 09:54:48

选项2的变体将起作用。如果您有这样的事情:

app/assets/stylesheets/pancakes_house.css.less.erb

然后将require其放入application.css文件中。然后pancakes_house先通过ERB,然后输出通过LESS处理器,然后输出的任何内容都将进入CSS。将ERB放入SCSS可能会有些奇怪,但是,嘿,它可以正常工作并完成工作而不会产生太多怪异。

因此,您应该能够找到必要的方法,以通过ERB生成消除缓存的图像路径。

我只用一个Less文件尝试过此操作,但它也应该可以使用.css.scss.erb


顺便说一句,您还可以将自己的功能添加到SASS中

可从SassScript上下文访问此模块中的方法。例如,你可以写

$color = hsl(120deg, 100%, 50%)

它会呼叫Sass::Script::Functions#hsl

甚至在手册中甚至还有一些关于编写自己的函数说明但是,我不确定如何获取Sprockets来加载您的Sass::Script::Functions补丁程序,因此我不能称其为实用的解决方案。拥有比我更强大的Sprocket Fu的人也许可以使这种方法行之有效,我称之为比ERBified SCSS更优雅。

达蒙伽罗Tom2020/03/19 09:54:48

sass-rails gem定义了可从Sass使用而无需ERB处理的Sass函数。 https://github.com/rails/sass-rails