2011-10-07 102 views
3

此问题与Why do I get “no route matches” for requests to the asset pipeline?类似。Rails 3.1,资产管道:无路由匹配

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

在生产模式下,我看到应用程序 - <摘要> .js和应用程序 - <摘要> .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。

所以我想你可能的问题是,“为什么不只是使用预编译的资产,而不用担心从延迟加载丢失的资产?好点。答:我只是想确保我明白我在做什么,发生了什么,并且我正确地做着事情。

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 
+0

那么,我已经使用预编译资产数月。这是要走的路。 –

回答

2

若y ou预编译资源并将compile设置为false,因为您已经告诉Rails根本不使用Sprockets,但是认为这些文件可以由nginx根据资产管道清单中的映射提供服务,因此禁用了debug。

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

我会假设链轮将为每个消化名称提供单独的文件。这种行为对我来说听起来有些奇怪,但我不认为它打算在生产中使用调试。

+0

你是对的:在生产中不应该需要这个。我不使用IE浏览器(开发机器是苹果机,应用程序在符合标准的浏览器中完美工作),但生产应用程序的所有用户都使用IE 7,8和9,有时添加'debug_assets'只是为了拥有一个快速查看或获取CSS或JS文件的准确行号。Sux认为它在生产模式下不可靠。 –