Ruby on Rails:清除缓存页面

86

我有一个 RoR 应用程序(ruby v1.8.7; rails v2.3.5),在开发环境中缓存了一个页面。这本来不是什么问题,但是缓存的页面中的 a 元素是错误的。

我没有对 development.rb 文件进行任何更改,也没有故意向控制器添加任何缓存命令。

我尝试清除浏览器(OSX 上的 Firefox 3.5)的 cookie 和该站点(localhost)的页面缓存。我还重新启动了 Mongrel,但似乎都没起作用。

我错过了什么?

6个回答

133

在development.rb文件中,这行代码确保不会发生缓存。

config.action_controller.perform_caching             = false

你可以使用以下方法清除Rails缓存:

Rails.cache.clear

话虽如此,我并不确信这是缓存问题。你修改了页面内容但没有看到反映吗?你有没有可能看的是该页面的实时版本?我曾经也犯过这种错误(害羞)。

更新:

你可以在控制台中调用该命令。你确定正在以开发模式运行应用程序吗?

唯一的可能性是,你尝试渲染的页面并不是实际渲染的页面。

如果你观察服务器输出,当页面被渲染后,你应该能够看到类似于以下的渲染命令:

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)

那行代码在development.rb文件中。我应该在哪里添加这个命令?是的。我对页面进行了更改,如果页面是“live”的话,应该显示这些更改--这就是我发现缓存问题的方式。 - craig
这似乎是我犯的一个愚蠢的错误。害羞感谢您的时间和帮助 - 我确实学到了很多。 - craig
没问题。很想知道问题出在哪里 - 这些问题通常都很难搞清楚 - 特别是当你犯了一个愚蠢的错误时 - 我觉得我很快就会犯同样的错误 :) - Apie
1
我已经为两个相关的模型嵌套了路由。在一个页面上,我在link_to中使用了edit_parent_child_path。不幸的是,我省略了父级的引用;它应该是edit_parent_child_path(@parent,child),而不是edit_parent_child_path(child)。 - craig
你可能没有看到那个页面的实时版本吗?我曾经犯过这样的错误(脸红)。 - Robert Vunabandi

116

rake tmp:cache:clear可能是您要寻找的内容。


2
如果环境不是开发环境,那么你需要添加(例如暂存)- RAILS_ENV=staging bundle exec rake tmp:cache:clear,否则我猜它不会起作用。 - poorva
这只会从tmp/cache目录中删除文件,而不会清除缓存存储数据。https://dev59.com/1mMk5IYBdhLWcg3wvARo - Oshan Wisumperuma

26

我通过清理我的资产缓存来解决了这个问题:

$ rake assets:clean

4

检查/public目录中是否存在页面的静态版本,如果存在则删除。Rails 3.x缓存页面时会在public文件夹中留下静态版本,并在用户访问网站时加载。即使您清除了缓存,这些静态页面仍然存在。


在Rails 4中,缓存项位于/tmp/cache/目录。 - Ivan Chau
这对我很有帮助。我一直在使用一个渲染页面来测试一些新代码,但服务器控制台没有报告任何我请求的新页面,这些页面将呈现相同的文本。我清除了缓存以为那是问题所在,但那并没有帮助。我在公共文件夹中找到了该页面,将其删除,现在它正常工作了。 - Reimus Klinsman

3
更多深奥的方法:
Rails.cache.delete_matched("*")

关于 Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }

2

如果您正在进行片段缓存,则可以通过更新缓存键来手动打破缓存,如下所示:

版本#1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

版本 #2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

或者您可以根据非静态对象的状态(例如ActiveRecord对象)自动重置缓存,方法如下:

<% cache @user_object do %>

使用这种方法,每当用户对象更新时,缓存将自动重置。

想要在特定的片段缓存中进行更改后自动重置,该怎么做? - Astm
@Astm 这就是你会使用最后一个选项的地方 - 将 AR 对象作为缓存键的一部分。当 updated_at 被修改时,AR 对象将不再匹配缓存键,这将导致片段被重新缓存。 - jeffdill2
我发现了一种简单的方法,可以通过使用以下语法 <% cache(['User_Cache', user_object], expires_in: 1.hour) do %> 自动清除缓存,如果有任何更改发生,它将自动更新缓存。 - Astm
1
@Astm 对的,那就是我提到的最后一个选项,即将 AR 对象作为缓存键的一部分。 - jeffdill2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接