49

我正在尝试将一些外部图像(由 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 中,一切正常。

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

有谁知道这里有什么问题?

4

4 回答 4

79

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

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

于 2011-09-20T03:25:29.310 回答
22

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

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

于 2011-09-06T18:56:36.947 回答
9

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

http://ryanbigg.com/guides/asset_pipeline.htmlhttp://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 的搜索路径。

于 2011-07-03T14:51:26.330 回答
2

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

于 2012-03-09T09:04:36.140 回答