【问题标题】:Rails 3.1, asset pipeline: no route matchesRails 3.1,资产管道:没有路线匹配
【发布时间】:2011-12-03 04:03:50
【问题描述】:

这个问题类似于Why do I get “no route matches” for requests to the asset pipeline?

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

在生产模式下,我看到了 application-.js 和 application-.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,你知道吗? ?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 

【问题讨论】:

  • 好吧,我已经使用预编译资产几个月了。这是要走的路。

标签: ruby-on-rails asset-pipeline


【解决方案1】:

如果您预编译资产并将 compile 设置为 false,调试将被禁用,因为您已告诉 Rails 根本不使用 Sprockets,但假设文件可以由 nginx 基于资产管道清单中的映射提供服务。

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

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

【讨论】:

  • 你是对的:在生产中不应该需要这个。我不使用 IE(开发机器是 Mac,应用程序在符合标准的浏览器中运行良好),但生产应用程序的所有用户都使用 IE 7、8 和 9,有时添加 debug_assets 只是为了拥有一个快速查看或获取 CSS 或 JS 文件的准确行号。 Sux 在生产模式下不可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多