2012-06-14 33 views
16

section 2.2.2, "CSS and Sass"中,我被告知将image-url('delete.png')放在我的菜单中。所以我有。sass-rails资产管道:错误地生成图像路径; `url(/images/blah.png)`而不是`url(/assets/blah.png)`

但是,生成CSS像

background-image: url(/images/delete.png) 

,而不是说我告诉无处不应该发生,正确的和显而易见的事情的东西,

background-image: url(/assets/delete.png) 

什么。哎呀。

我花了几天的时间试图弄清楚这是从哪里来的。

这是a gist of relevant settings导致此行为。这里是a gist of the same files in an earlier version of our code base(在我们实施了资产管道之后,它实际上在这种令人沮丧的行为出现之前实际工作了大约一周)。你能发现差异吗?你能想到的任何其他文件可能会导致这种情况?

  • 我们特意使用sass-rails一个老版本,因为在预编译的新版本是导致Stack level too deep!错误。
  • 我们正在使用指南针。在解决方法

    因为实际上故障排除的资产管道还挺吮吸


两个hackish的尝试。

1:将图像/影像

我试图只是所有图像移动到public/images,并添加作为负载路径。这在dev中可用(图像可以在/assets/images下访问),但是对于生产的预编译只会将指纹图像置于/assets(obvs),所以当sass-rails放入url(/imagse/delete-120398471029384102364.png)时,找不到它。

2:制作/公共/图像的符号链接到/公/资产

这将在生产中可能的工作,但在发展中/资产文件夹不存在,所以url(/images/delete.png)指令导致unfound图像。

+0

你有没有尝试过以下方法:'asset_path'delete.png''? – ccyrille

+0

这将是'asset-url('delete.png',image)'。是的,我试过了。正如人们所希望的那样,'image-url('delete.png')'只是简写。他们有完全相同的行为。 – chadoh

+0

如何使用.sass.erb文件并使用<%= asset_path('delete.png')%>?虽然它仍然是一种解决方法,但是如果sass-rails出现故障,可能值得尝试诊断。 – Chris

回答

2

它看起来像这个问题:https://github.com/rails/sass-rails/issues/57 如果是这样,你应该尝试找到Compass和Sass-rails之间的良好组合版本。

也许升级的一切(包括滑轨)到最新版本,它仍然是做(在捆绑1.2使用bundle outdated命令知道升级什么宝石)

+2

“尝试在Compass和Sass-rails之间找到好的版本组合”。真棒。我喜欢这样的解决方案。 “放入两个随机版本,'bundle update','rake tmp:cache:clear',并移位 - 刷新浏览器。”这是我在SO上问之前所做的。它很烂。 – chadoh

+0

尽管感谢您的错误链接。看起来它仍然困扰着很多人,虽然(关闭后很多评论说它仍然在发生)。 – chadoh

2

这是我们的HAML护栏的组合的最佳方式,指南针和sass护栏。不过我们运行rails 3.2.6。 这对我们很有效。

gem'compass',git:'git://github.com/chriseppstein/compass。混帐 '裁判: '3a4c5c75dca9f07f6edf2f0898a4626269e0ed62'

宝石 'HAML护栏',git的: '混帐://github.com/indirect/haml-rails.git',裁判: '92c41db61f20a9f122de25bc73e5045cfccdbcd5'

宝石'上海社会科学院护栏,‘〜> 3.2.5’

10

如果你没有这个已经,命名你的CSS文件*.css.scss(相对于.sass - 如果你这样做,你可能需要调整一些语句的语法)。然后使用image_path帮手,而不是image-path,例如:

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

我预计这将解决您的问题。如果没有,这种方法为您产生的资产路径是什么?

+0

这不起作用(除非我没有采取适当的步骤,这是一种可能性;我进行了更改,然后执行'rake tmp:cache:clear && rm -r .sass-cache/*',然后cmd + shift -R在Chrome中的页面,所有的资产返回状态200而不是202未修改 - 应该工作?)。它给出了我以前的相同结果(“/ images”被返回而不是“/ assets”)。不过,我甚至都没有在任何文档中看到这种语法。为什么不'image-url'? – chadoh

8

这看起来是由于您的青菜护栏的版本(3.1.0)。我可以重现您的问题(感谢发布Gemfile),并且在碰撞到sass-rails 3.1.4时它会消失。

尝试升级到3.1.4和清除tmp/cache。还要确保你没有碰到任何浏览器缓存。

我知道你说的3.1.4是造成其他问题......你有没有试过更高版本?

+1

这是我第一次尝试它,所以我的upvote,导致你得到我原来的一半奖金。但是,似乎我做了其他事情,因为回到原来的3.1.0版本继续工作。我今天重试(几个星期后),sass-rails 3.1.4不再有效。升级Rails和sass-rails到3.1.6也失败了。我可能会尝试升级到3.2,但这是很多工作。 – chadoh

+1

你在测试之间清除缓存(特别是浏览器和RAILS_ROOT/tmp/cache)吗? – avaynshtok

+0

在每次代码更改后,我会''rake tmp:cache:clear && rm -r .sass-cache/*',然后在Chrome中使用cmd + shift-R(不依赖缓存)。 – chadoh

0

不一定是解决办法,但肯定是一个可行的选择:如果你打开使用拼合指南针,你会削减HTTP请求的数量,并能够与精灵地图手动指定图片路径,即'$ sprites:sprite-map(“PATH/*。png”);'

+0

有趣的思想;看起来Compass仍然会(通过sass)为此创建一个“/ images”指令,而不是正确的“/ assets”。 – chadoh

+0

啊,你说的没错。我在我的描述中忘记了在资产文件中包含必要的相对路径标志。 c.relative_assets = true – RhinoWalrus

0

完整性检查当前资产管道中的文件。检查它在这里列出的目录之一:

<%= debug Rails.application.config.assets.paths %> 

在什么相对路径指南针期望找到图像下检查(,看看它是否垫按照Compass config docs,这些应该告诉你一个: 。

<%= debug config.compass.http_images_path %> 
<%= debug config.compass.http_generated_images_path %> 

我猜这是第一个无论哪种方式,比较它们的路径图像的asset_path:

<%= debug asset_path 'delete.png' %> 

如果路径不匹配,也许您需要在您的环境CONFIGS(development.rb,...)来调整路径此例如:

config.compass.http_images_path = '/assets. 

或者,你可以移动图像到http_images_path或http_generated_images_path希望找到它。

在点,asset_path/ASSET_URL(比脆硬编码少得多),应该有希望的工作。我基于similar technique的这一关,我看到的样式,

+0

谢谢!这一切看起来不错,但。 “asset_path”和“image_path”助手在erb/haml中工作。这是sass中无法工作的'(asset | image) - (path | url)'助手。 – chadoh

0

对于我来说,

更改image_pathimage-path工作了.scss。稍后,我再次更改为image_path,现在工作正常。

删除缓存没有帮助我。

-2

当我编辑我的。scss文件(添加一个空格)并重新加载页面我得到正确的结果。我删除了它正确工作的空间后。