Rails 3.1 提供来自供应商/资产/图像的图像

Posted

技术标签:

【中文标题】Rails 3.1 提供来自供应商/资产/图像的图像【英文标题】:Rails 3.1 serving images from vendor/assets/images 【发布时间】:2011-09-27 13:48:42 【问题描述】:

我正在尝试将一些外部图像(由 jQuery 插件使用)放到我的 Rails 3.1 应用程序中的供应商/资产/图像中。问题是当我尝试类似:

<%= image_tag "ui-bg_flat_75_ffffff_40x100.png" %>

我收到一个错误:

No route matches [GET] "/assets/ui-bg_flat_75_ffffff_40x100.png"

我检查了我的 Rails.application.config.assets.paths,它列出了这些目录:

..../app/assets/images
..../app/assets/javascripts
..../app/assets/stylesheets
..../vendor/assets/images
..../vendor/assets/stylesheets
..../.rvm/gems/ruby-1.9.2-p180@mygems/gems/jquery-rails-1.0.9/vendor/assets/javascripts

如您所见,/vendor/assets/images 已在此处列出。如果我将我的图片放到 app/assets/images 中,一切正常。

我认为新的资产管道应该遍历所有资产目录并在找到它的任何地方提供请求的文件。

有人知道这里有什么问题吗?

【问题讨论】:

抱歉,不能完全解决您的问题,但是您如何看待 Rails.application.config.assets.paths ? @martin:你可以在控制台看到 这可能是一个愚蠢的问题,但是您的 jqueryui 资产在 images 目录中吗?我的是在 image 目录中,然后在他们自己的子目录中保存 jqueryui 主题生成器生成的 CSS 路径。 遇到同样的问题,对我来说感觉就像一个错误。 我确定你已经尝试过了,但以防万一:即使在将资产移动到正确的位置、修改 jQuery UI CSS 图像路径并确保一切正常之后,我也遇到了同样的问题正确的。重新启动开发服务器最终解决了它。似乎 Sprockets 需要重新启动才能获得新资产。 【参考方案1】:

创建vendor/assets/images 目录后,我必须重新启动我的rails 服务器。在此之前,我看到了和你一样的错误(“没有路线匹配 [GET]”)。

我的猜测是,如果这些目录在首次启动时不存在,rails 服务器不会检查这些目录。当您打开 rails 控制台来诊断问题时,您会得到一个新的 rails 实例,它知道目录,这只会增加混乱。

【讨论】:

使用 Pow(和粉末宝石)我只是尝试了“粉末重启”,但没有成功。然后我尝试了 'powder down' 和 'powder up' 最后 Rails.application.config.assets.paths 包括 vendor/assets/images。 如果您正在使用 pow,只需在控制台中 touch tmp/restart.txt 即可重新启动单个应用程序。无需关闭整个服务器。【参考方案2】:

如果您使用的是 jQuery UI Theme Roller 主题,那么问题可能是在 jquery-ui css 文件中,图像在子文件夹“images”中被引用。

即您要么必须将图像放在文件夹 './app/assets/images/images' 中,要么必须编辑 jquery-ui css 文件并删除“images/”文件夹前缀。

【讨论】:

您可能会在 javascript 控制台中看到 GET http://example.com/assets/images/darrowleft.gif 404 (Not Found) 而您在 vendor/assets/images 中拥有该图像,这有点令人困惑。但是,您应该查看 URL 的 http://example.com/assets/darrowleft.gif。要查看http://example.com/assets/images/darrowleft.gif,您必须将该图像放入vendor/assets/images/images,正如@woelfle 解释的那样。这样做可以省去修改供应商 CSS 文件中路径的麻烦。 将图像放在另一个名为 images 的文件夹中似乎很奇怪,但在 rails 3.1.3 上对我有用。谢谢! 谢谢你,George,这是我拼图中缺失的一块!【参考方案3】:

Ryan Bigg 在此 Rails 指南中描述了资产管道(目前处于草案状态)。

http://ryanbigg.com/guides/asset_pipeline.html 和 http://ryanbigg.com/2011/06/sprocket-asset-tags-internals/ 供参考。

据此,您的示例应该可以工作。

摘录:

资产可以放置在三个位置之一的应用程序中:app/assets、lib/assets 或 vendor/assets。

app/assets 用于应用程序拥有的资产,例如自定义图像、javascript 文件或样式表。

lib/assets 用于您自己的库代码,这些代码并不真正适合应用程序的范围或跨应用程序共享的库。

vendor/assets 用于外部实体拥有的资产,例如 JavaScript 插件的代码。

这三个位置中存在的任何子目录都将添加到 Sprockets 的搜索路径中(可通过在控制台中调用 Rails.application.config.assets.paths 来查看)。当请求资产时,将查看这些路径以查看它们是否包含与指定名称匹配的资产。一旦找到资产,Sprockets 就会对其进行处理,然后提供服务。

我在我的应用程序中使用了一个示例进行了测试,并且与您的语法相同。也许您的资产名称中有错字。

对于 Martin:通过在控制台中调用 Rails.application.config.assets.paths 可以看到 Sprockets 的搜索路径。

【讨论】:

是的,我已经读过了。这就是为什么我认为它应该起作用。也许这是一个错误。 对我来说确实有效。您是否尝试将资产重命名为测试? 这是我在 Rails 3 中构建的所有应用程序中反复出现的问题 只在应用程序/资产中搜索图像(至少在 Rails 4 中)。这里有一些配置可以改变:***.com/a/14195512/161815【参考方案4】:

也许您应该在 /assets/images 中创建另一个文件夹。您命名为“图像”,然后您只需复制所有 jquery-ui 图像并粘贴到您之前创建的文件夹“图像”上。希望这会对您有所帮助。

【讨论】:

以上是关于Rails 3.1 提供来自供应商/资产/图像的图像的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.1 资产管道和手动订购的 Javascript 需要

Rails 3.1 资产管道 - 为啥我的图像没有为生产进行预编译?

如何在 Rails 3.1 中包含供应商 js

Rails 3.1 资产预编译 - 包括所有 javascript 文件

Rails 3.1 资产管道和缓存

Rails 5 - 如何在资产管道中包含所有供应商资产?