我最近将项目从Rails 4更新到了Rails 5.2。经过测试,我发现缓存没有在应有的位置被更新。
在阅读文档时,我注意到ActionView进行缓存的方式有所不同。
Rails 4在高速缓存名称上包含updated_at
值。这样,每次触摸该元素时,以前的缓存就会过时,并创建一个新的缓存。
views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
^class ^id ^updated_at ^template tree digest
太好了。但是Rails 5.2进行了一些更改,其中不再在缓存名称中设置了updated_at值。从文档中:
views/template/action.html.erb:7a1156131a6928cb0026877f8b749ac9/projects/123
^template path ^template tree digest ^class ^id
文档仍然指出:
触摸项目updated_at时,即使键保持稳定,cache_version也将更改。这意味着,与传统的基于键的缓存过期方法不同,您不会因为仅更新了相关记录而生成缓存垃圾,未使用的键。
据此,我想它在幕后做了一些魔术来替换缓存中的值,但事实并非如此。
我的代码:
<% cache ['tags', post] do %>
<%= render "shared/tags", post: post %>
<% end %>
即使我在控制台上post.touch
cache "tags/#{post.updated_at}" do
...
,缓存仍然保持旧的状态,我必须手动删除缓存才能正常工作。我想念什么吗?我如何使其重新工作?
我知道我可以做类似的事情
ResetOnRespawn
但是从文档来看,感觉不对。
答案 0 :(得分:0)
我知道了。我的项目使用Redis来存储缓存,并且升级后我没有从我的Gemfile中删除gem redis-rails
。从redis-activesupport
gem写入缓存的方法是覆盖为redis内置的rails,该方法是从Rails 5.2开始引入的。
因此解决方法只是删除redis-rails
宝石。