31

我已经开始开发简单的 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?

4

2 回答 2

43

This option's effect is well described in this post, but I'll summarize it here as well. The value of changing config.assets.debug lies in a compromise between page load time in development and ease of debugging.

Basically:

config.assets.debug = true: assets are served individually, organized just as you see them in development. Preprocessed languages like SASS or CoffeeScript will still show up as their target languages (i.e., CSS and JS, respectively).

config.assets.debug = false: assets are bundled into files like application.css and application.js. Error stack traces will likely not have the correct line number any more and it is harder to map those back to your original code.

于 2013-12-31T15:25:43.993 回答
2

如果您访问此网页,您可能会在这里,因为您使用的是 Rails 资产管道,并且您对其中一个 javascript 文件进行了更改并重新加载了页面,并且当您在 Sources 选项卡中搜索时,更改不会反映出来在铬。

如上所述,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 默认只附带片段缓存。您必须为 Page 和 Action 缓存安装单独的 gem。

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

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

于 2018-03-27T20:46:38.317 回答