Rails 4 Fragment Cache整页。如何在模型中使缓存过期

时间:2016-02-12 16:28:17

标签: ruby-on-rails-4 caching fragment-caching

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

在我的HTML中

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

在我的帖子模型中

after_create :clear_cache
after_update :clear_cache

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

这不会清除缓存。如果我创建或更新帖子,缓存不会清除。如果我在rails控制台中运行ActionController::Base.new.expire_fragment('main-page'),则返回'nil'。如果我在帖子模型中运行Rails.cache.clear而不是ActionController::Base.new.expire_fragment('main-page'),那就可以了。

1 个答案:

答案 0 :(得分: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 %>