防止Rails 3.2.11资产管道缓存?

时间:2013-03-13 05:53:33

标签: ruby-on-rails caching ruby-on-rails-3.2 asset-pipeline

我已经阅读了很多帖子,文章和问题。 Rails资产管道的答案 但我仍然没有想出如何完全关闭缓存。

我们正在使用Rails 3.2.11并且在我们的实验室环境中(类似于开发)我们遇到了问题,因为即使我们没有在资产管道中预编译或指纹识别资产,它们仍然被缓存在Rails(Rack?)缓存。这很烦人,因为某些资产是基于其他配置而更改的ERB,因此缓存变得陈旧。为了尝试关闭缓存,我们设置了此配置:

  config.action_controller.perform_caching = false

  config.assets.compress = false

  config.assets.debug = true

  # just in case
  config.cache_store = :file_store, "file_cache"

但是,无论如何,资产都会显示在tmp/cache/assets中。我至少会期望它们出现在file_cache中,但我真的希望它们不会被缓存。

我们如何防止这些资产被缓存?在这种环境下,仅仅删除缓存是不够的。

加分问题:只要这些文件被缓存,为什么它们在tmp/而不在file_cache/

3 个答案:

答案 0 :(得分:8)

关闭资产缓存:

config.assets.cache_store = :null_store

请注意,这是config。 assets .cache_store而不是Rails config.cache_store。

另请注意,Sass为已编译的样式表提供了单独的缓存,默认情况下为tmp/cache/sass,如果要禁用,则必须单独执行此操作:

config.sass.cache = false

要回答红利问题Rails Guide说:

  

Sprockets将使用默认的Rails缓存存储来缓存开发和生产中的资产。

我认为它们意味着将使用配置的 Rails缓存存储。我错了,它使用默认缓存,除非您明确更改资产缓存。

答案 1 :(得分:-1)

要完全禁用资产管道,可以在环境文件中添加此指令:

config.assets.enabled = false

但是如果你仍然希望享受静态JS和CSS的资产管道编译和缓存,同时使用ERB文件作为动态资产,你可以创建一个my_assets_controller并为该控制器创建视图。提供动态内容(扩展名为.css.erb.js.erb的文件)。您只需要在视图或布局文件<%= javascript_path '/my_assets/things_dynamically_generated.js' %>

中加入

答案 2 :(得分:-1)

这听起来像是XY问题。

原则1:构建必须是确定性的,并且与每个环境的配置无关。

原则2:静态资产编译必须是构建的一部分。

你应该转向拥有纯粹的静态资产。您可以使用ERB,但只是调用asset_path之类的方法,这些方法是确定性的,并且在给定相同代码库的情况下会产生相同的结果。您可以在其中放置基于配置的数据或行为,但前提是所有部署(dev,test,staging,qa,pre-prod和prod)中的数据或行为相同。

来自每个环境配置的任何内容都不应该进入静态资产。相反,您可以在HTTP标头,<html>元素中的属性或其他注入技术中传递它。静态资产代码应足够智能,以便在HTTP标头或<html>属性中查找注入的数据,并根据注入的数据更改其行为。

至于奖金问题,config.cache_store不是链轮,sass,指南针等缓存的控制配置项。