更新寄存器时如何更新片段缓存?

How do I update the fragment caching when register is updated?

我最近刚刚将我的项目从 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

不过,文档指出:

When the project updated_at is touched, the cache_version changes, even if the key stays stable. This means that unlike a traditional key-based cache expiration approach, you won't be generating cache trash, unused keys, simply because the dependent record is updated.

据此,我认为它在幕后做了一些魔术来替换缓存中的值,但它没有。

我的代码:

<% cache ['tags', post] do %>
  <%= render "shared/tags", post: post %>
<% end %>

即使我 post.touch 在我的控制台上,缓存仍然是旧的,我必须手动删除缓存才能工作。我错过了什么吗?我如何让它重新工作?

我知道我可以做类似的事情

cache "tags/#{post.updated_at}" do
...

但是从文档来看,感觉不对。

我明白了。我的项目使用redis来存储缓存,升级后我没有从我的Gemfile中删除gem redis-rails。从 redis-activesupport gem 写入缓存的方法覆盖了 rails 内置的 redis 方法,自 Rails 5.2.

所以修复只是擦除 redis-rails gem。