如何使模型中的主页片段到期?
在我的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')
,那就可以了。
答案 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 %>