Rails 3.1和图像资产


156

我已将所有用于我的管理主题的图像放在资产文件夹中的名为admin的文件夹中。然后,我像正常的ie链接到它。

# Ruby    
image_tag "admin/file.jpg" .....
#CSS
.logo{ background:url('/assets/images/admin/logo.png');

仅供参考。只是为了测试,我还没有使用asset_path标记,因为我还没有编译我的资产。

到目前为止一切都很好,直到我决定更新映像为止。我替换了一些颜色,但重新加载后,新样式的图像未显示。如果我直接在浏览器中查看图像,它仍显示旧图像。更进一步,我销毁了管理映像文件夹。但这并没有破坏所有仍在显示的图像。是的,我已经清除了缓存,并在多种浏览器上进行了尝试。

是否存在某种图像缓存?这只是使用pow服务页面的本地开发。

即使销毁整个图像文件夹,图像仍会被提供。

我想念什么吗?


2
3.1使用资产管道的情况并非如此。您将使用命令rake asset:precompile压缩这些文件并将其移动到公共文件中
Lee

2
很好地将它们移动到公用文件夹很有效,因为从资产文件夹中可以很好地工作,这一切都有些奇怪。也许必须等待3.1的更多文档。
李李

3
我了解您的无奈。显然,发布候选版本的文档记录得不好。
tybro0103 2011年

1
将它们保留在资产中,只是根本不包括文件夹路径。请参阅下面的答案。
安德鲁

Answers:


226

在3.1中,您只是摆脱了路径的“图像”部分。因此,存在于其中的图像/assets/images/example.png实际上可以在此URL的get请求中访问-/assets/example.png

因为该assets/images文件夹是随新的3.1应用程序一起生成的,所以这是他们可能希望您遵循的约定。我认为这是image_tag寻找它的地方,但我尚未对此进行测试。

另外,在RailsConf主题演讲中,我还记得D2h所说的public folder不再有太多内容了,主要是错误页面和favicon。


是的,我玩过这个分配,他们还有一些路要走,以使其变得更容易。是的,可以将它们放在我的资产文件夹中,但是可以使用资产标签。所以我在等着看更多的信息。

1
谢谢,对我也有很大帮助。这种东西让我很疯狂,因为一个家伙试图学习来自其他Web开发框架的Rails。
jn29098 2012年

6
如果两个不同的文件夹包含相同的文件名,将会发生什么?
哈迪·艾尔萨哈尔

6
不应该是DH2吗?
Tiago Franco

1
不知道为什么他们必须更改已经起作用的东西。
Deliciousbrownies 2013年

98

您需要将css文件的扩展名从更改为.css.scss.css.scss.erb然后执行以下操作:

background-image:url(<%=asset_path "admin/logo.png"%>);

您可能需要执行“硬刷新”才能看到更改。OSX浏览器上的CMD + SHIFT + R。

在生产中,请确保

rm -rf public/assets    
bundle exec rake assets:precompile RAILS_ENV=production

在部署时发生。


44
有在上海社会科学院新形象助手:IMAGE_URL,IMAGE_PATH,...更多可以在这里找到:edgeguides.rubyonrails.org/asset_pipeline.html 没有必要使用ERB作为预处理了
马丁Wawrusch

1
我尝试将sass-rails助手(image_url和image-url)放入css.scss文件中,但似乎无法解释。有什么线索吗?
invaino 2011年

2
默认情况下,生成的scss文件名为.css.scss,但尚未发生床铺撕裂事件
Adrian Macneil

2
由于某些原因,image-url对我不起作用,但是asset-url('myimage.png',image)完美地工作了。(Rails 3.1)
Elad 2012年

1
如果有人想从3.0升级,您可以将样式表.css.css.erbapp/assets
从重

22

对于它的价值,当我这样做时,我发现css文件的路径中不应包含任何文件夹。例如,如果我有app/assets/images/example.png,并将其放在我的css文件中...

div.example { background: url('example.png'); }

...然后以某种方式神奇地起作用。我通过运行rake assets:precompile任务解决了这个问题,该任务只是从所有加载路径中吸取所有内容并将其转储到垃圾抽屉文件夹中:public/assets。讽刺的是,IMO

无论如何,这意味着您不需要放置任何文件夹路径,资产文件夹中的所有内容最终都将驻留在一个巨大的目录中。该系统如何解决文件名冲突尚不清楚,您可能需要注意这一点。

令人沮丧的是,对于这种巨大的变化,没有更好的文档了。


3
发生命名冲突时,出现在config.assets.paths数组中的第一个路径是所选文件。可以通过使用asset_path()帮助程序并指定目录来避免这种情况。
Joseph Ravenwolfe

6
这是“神奇的工作原理”,因为css文件和图像位于同一位置。CSS文件引用是相对于CSS文件的位置而言的。
Bill Leeper

资产管道可能有点黑匣子,尤其是对于前端开发人员而言,但它提供了许多很棒的功能,例如不必担心文件路径和自动缓存清除。
英里

16

在rails 4中,您现在可以使用css和sass helper image-url:

div.logo {background-image: image-url("logo.png");}

如果没有显示背景图像,请考虑查看您如何在样式表中引用它们。


1
这是正确的(对于导轨4)。投票给这个答案!
ahnbizcad 2014年

Rails通过输入url关键字和字符串来“帮助您”。这意味着您可以做类似的事情。div.logo {background: image-url("logo.png") no-repeat center;}
Antony Denyer

10

在CSS或IMG标签中引用图像时,请使用image-name.jpg

而图片确实位于./assets/images/image-name.jpg下


我认为这对CSS是错误的-当我使用rails 3.1.0.rc4时,background: url('sort_asc_disabled.png')它适用于文件app / assets / images / sort_asc_disabled.png。
wonderfulthunk


0

Rails中的资产管道为这种确切的事情提供了一种方法。

您只需将image_path('image filename')添加到css或scss文件中,Rails便会处理所有事情。例如:

.logo{ background:url(image_path('admin/logo.png'));

(请注意,它的工作方式与.erb视图类似,并且在路径中不要使用“ / assets”或“ / assets / images”)

Rails还提供了其他帮助程序方法,这里还有另一个答案:使用Rails 3.1时如何在Sass中使用参考图像?


我知道这个问题已有几年历史了,但这是我在Google上搜索该页面时找到的第一页,因此选择一个答案非常好,这样其他人就可以轻松参考这个问题!
benrugg
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.