究竟“config.assets.debug”设置到底是什么?

我已经开始开发简单的rails应用程序了。 经过几个小时的工作后,我注意到删除的css仍以某种方式应用于网页。

为了解决这个问题,我多次执行了以下操作:

  1. 停止/启动服务器
  2. 使用rails服务器
  3. 使用扭矩箱服务器
  4. 删除浏览器缓存

但没有变化。 这很奇怪 – 新的css定义已经应用,但我删除的那些仍然存在。 所以,我放弃了,决定创建新项目。

我已经设置了新项目(它的脚手架与第一个脚手架相同),当我打开其中一个视图时,旧项目的样式也被应用了。 我决定再次查看http://guides.rubyonrails.org/asset_pipeline.html并找出该设置

#Expands the lines which load the assets config.assets.debug = false 

解决了这个问题。 但这个选项究竟做了什么呢? 当这是真的时,为什么旧​​的项目css被应用?

这个选项的效果在这篇文章中有详细描述,但我也在这里总结一下。 更改config.assets.debug的价值在于开发中的页面加载时间和调试的简易性之间的折衷。

基本上:

config.assets.debug = true :资产按单独提供,按照您在开发中看到的方式进行组织。 像SASS或CoffeeScript这样的预处理语言仍然会显示为目标语言(分别是CSS和JS)。

config.assets.debug = false :资产被捆绑到application.cssapplication.js等文件中。 错误堆栈跟踪可能不再具有正确的行号,并且更难将它们映射回原始代码。

如果你进入这个网页,你有可能在这里,因为你正在使用Rails资产管道,你对其中一个javascript文件进行了更改并重新加载了页面,当你在Sources选项卡中搜索时,没有反映出更改在Chrome中。

如上所述, config.assets.debug = false会提示Sprockets gem将所有单独的javascript和css文件分别捆绑到一个application.js和application.css中。 Sprockets还在所有相关文件上运行SASS和CoffeeScript(如果您没有使用–skip-coffee)预处理器,以生成浏览器可以理解的css和javascript文件。

一个重要的注意事项如下。 Ruby Guides说这关于debug = false:

服务器启动后,资产将在第一个请求中缓存。 如果清单中的任何文件在请求之间发生了更改,则服务器将使用新的编译文件进行响应。

这意味着如果您不在请求之间更改css或javascript文件,则将使用缓存。 更改文件后,缓存将失效,并为后续请求创建新缓存。

因此,如果您对javascript文件进行了更改,并且更改未在页面重新加载时反映出来,则它与此选项config.assets.debug无关。

还有另一个名为config.action_controller.perform_caching选项。

但默认情况下,此选项在开发中默认为false。 也就是说,默认情况下,缓存仅在生产环境中启用。 在当前版本中,Rails默认只附带Fragment Caching。 您必须为页面和动作缓存安装单独的gem。

片段缓存允许视图逻辑的片段被包装在缓存块中,并在下一个请求进入时从缓存存储器中提供。但是,当视图片段发生更改时,缓存片段也将过期(例如,HTML中的视图变化)。

所以问题仍然是为什么你的javascript的变化没有反映出来? 答案是谷歌浏览器,浏览器本身,尽管你的Rails设置,仍在缓存页面。 要删除缓存,请关闭当前选项卡,打开新选项卡,然后再次访问该站点。