Ruby on Rails:清除缓存的页面


81

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

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

我曾尝试清除该网站(localhost)的浏览器(OSX上的Firefox 3.5)的cookie和页面缓存。我还重新启动了Mongrel。似乎没有任何帮助。

我想念什么?

Answers:


125

development.rb中的这一行确保不会发生缓存。

config.action_controller.perform_caching             = false

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

Rails.cache.clear

话虽如此-我不相信这是一个缓存问题。您是否正在对该页面进行更改,而没有看到它们的反映?您可能不是在查看该页面的实时版本?我已经做了一次(脸红)。

更新:

您可以从控制台中调用该命令。您确定要在开发中运行该应用程序吗?

唯一的选择是您要呈现的页面不是正在呈现的页面。

如果您观看服务器输出,则在渲染页面时应该可以看到render命令,如下所示:

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文件中。我在哪里添加该命令?是。如果页面“处于活动状态”,我对应该显示的页面进行了更改-这就是我发现缓存问题的方式。
克雷格2010年

在我看来,这似乎是一个愚蠢的错误。 脸红 感谢您的时间和协助-我确实学到了很多东西。
克雷格2010年

没问题。很想知道问题出在哪里-这些东西总是很晦涩-最重要的是,当您犯一个愚蠢的错误时-我认为我一定会在某个时候犯同样的错误:)
Apie 2010年

1
我已经为两个相关模型嵌套了路线。在一页上,我在link_to中使用edit_parent_child_path。不幸的是,我省略了父母的参考。它是edit_parent_child_path(child),需要为edit_parent_child_path(@ parent,child)。
克雷格

“您也许不是在查看该页面的实时版本?我曾经(腮红)这样做过。” 大声笑这只是发生在我身上哈哈
罗伯特·沃纳班迪


25

我可以通过清理资产缓存来解决此问题:

$ rake assets:clean

4

在/ public中检查页面的静态版本,如果存在,则将其删除。当Rails 3.x缓存页面时,它将在您的公用文件夹中保留一个静态版本,并在用户访问您的网站时进行加载。即使您清除了缓存,该设置仍将保留。


在Rails 4中,缓存位于/tmp/cache/目录中的项目。
Ivan Chau

这对我有用。我一直在获取用于测试一些新代码的渲染页面。服务器控制台未报告我请求的任何将呈现相同文本的新页面。我清除了缓存,认为这是问题所在,但这没有帮助。我在公用文件夹中找到该页面,将其删除,现在它可以正常工作。
Reimus Klinsman

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)会自动更改缓存的简便方法,如果user_object有任何更改,它将自动更新快取
Astm

1
@Astm对,这是我提到的最后一个选项,使用AR对象作为缓存键的一部分。
jeffdill2

1

更深奥的方式:

Rails.cache.delete_matched("*")

对于Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.