Rails 4 片段缓存整个页面。如何使模型中的缓存过期

Rails 4 Fragment Cache Entire Page. How to Expire Cache In Model

如何使模型中的主页片段过期?

在我的HTML

<% cache 'main-page' do %>
  # html here
<% end %>

在我的Post模型中

after_create :clear_cache
after_update :clear_cache

def clear_cache
  ActionController::Base.new.expire_fragment('main-page')
end

这不会清除缓存。如果我创建或更新 post,缓存不会清除。如果我 运行 ActionController::Base.new.expire_fragment('main-page') 在 rails 中安慰它 returns 'nil'。如果我 运行 Rails.cache.clear 而不是 post 模型中的 ActionController::Base.new.expire_fragment('main-page'),它就可以工作。

我认为你的问题是摘要,所以如果你将缓存更改为此它应该可以工作:

<% cache 'main-page', skip_digest: true do %>
  # html here
<% end %>

如果你想使用这种缓存不会过期并依赖于检测模型更改来失效的样式,你可能需要考虑使用 Observer 或 Sweeper,它们已从 Rails 4,但对这种模式很有用:

https://github.com/rails/rails-observers

也许不是你要找的答案,而是另一种方式:

根据 Post 模型中的最大值 updated_at 创建缓存键。

每当任何 post 更改时,缓存键将自动丢失并检索最新的 post 以重新缓存该部分视图。

module HomeHelper
  def cache_key_for_posts
    count          = Post.count
    max_updated_at = Post.maximum(:updated_at).try(:utc).try(:to_s, :number)
    "posts/all-#{count}-#{max_updated_at}"
  end
end

然后在您看来:

<% cache cache_key_for_posts, skip_digest: true do %>
  # html here
<% end %>