更新寄存器时如何更新片段缓存?
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。
我最近刚刚将我的项目从 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。