Rails 3.1,资产管道:没有路由匹配

时间:2011-10-07 16:46:36

标签: ruby-on-rails asset-pipeline

此问题与Why do I get “no route matches” for requests to the asset pipeline?类似。

我有一个rails 3.0应用程序,我升级到3.1并转换为使用新的资产管道(感谢RailsCasts #282#279)。

在生产模式中,我看到了application-< digest> .js和application-< digest> .css。大!如果我查看这些文件的来源,我会看到它们已被压缩。绮山楂!这意味着资产管道正在运转,对吗?

但是,如果我将?debug_assets=1添加到URL以便我可以查看单个文件,其中一些文件正在生成ActionController::RoutingError (No route matches [GET] "/assets/<filename>-<digest>.js"),对于某些CSS文件也是如此。但不是全部,只是一些,我无法弄清楚是什么让一些文件做到这一点而其他文件没有。

我清除了tmp / cache / *并重启了Passenger。我碰到了config.assets.version。我重新启动了memcached。这些似乎都没有解决它。但奇怪的是,只有当我在URL中使用?debug_assets=1时,才会出现这种情况。没有它,我只看到一个JS和CSS文件,全部压缩和缩小。

顺便说一句,我不使用预编译资产。但只是为了笑容,我表演了rake assets:precompiled,而且whaddya知道吗? ?debug_assets=1现在显示所有JS和CSS文件,其中没有一个是404'd。

所以我猜你可能会遇到的问题是,“为什么不使用预编译资产而不担心从延迟加载中丢失资产?”好的一点。答:我只是想确保我理解我在做什么,发生了什么,以及我正在做的事情。

application.rb中

config.assets.enabled = true
config.assets.version = '1.2'

production.rb

config.assets.compress = true
config.assets.compile = true
config.assets.digest = true
config.assets.js_compressor  = :uglifier
config.assets.css_compressor = :scss

development.rb

config.assets.compress = false

# I keep this off during development because I want
# to make sure the compression isn't breaking my JS
config.assets.debug = false 

1 个答案:

答案 0 :(得分:2)

如果您预编译资产并将compile设置为false,则禁用调试,因为您已经告诉Rails根本不使用Sprockets,但是假设nginx可以根据资产管道清单中的映射来提供文件。 / p>

当compile为true时(就像你一样),那么对这些资产(和调试请求)的请求将被发送回Sprockets进行处理,如果文件丢失(没有预编译就是这种情况)。

我会假设Sprockets会为每个消化的名称提供单独的文件。这种行为对我来说听起来很麻烦,尽管我认为无论如何都不打算在生产中使用调试。