0

How do I expire the main-page fragment in a model?

In my HTML

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

In my Post Model

after_create :clear_cache
after_update :clear_cache

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

This doesn't clear the cache. If I create or update a post, the cache doesn't clear. If I run ActionController::Base.new.expire_fragment('main-page') in rails console it returns 'nil'. If I run Rails.cache.clear instead of ActionController::Base.new.expire_fragment('main-page') in the post model, it works.

4

1 回答 1

1

我相信您的问题是摘要,因此如果您将缓存更改为此它应该可以工作:

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

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

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

也许不是您正在寻找的答案,而是另一种方式:

根据 Post 模型中的 max updated_at 创建缓存键。

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

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 %>
于 2016-02-12T16:42:30.887 回答