首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么需要在控制器中声明缓存清除器?

为什么需要在控制器中声明缓存清除器?
EN

Stack Overflow用户
提问于 2012-05-09 18:05:16
回答 1查看 868关注 0票数 3

缓存清扫器是在它所观察的模型上有一些钩子的观察者:

代码语言:javascript
复制
class MySweeper < ActionController::Caching::Sweeper
  observe MyModel

  def after_update(my_model)
    expire_page(...)
  end
end

但是文档和指南也说要在控制器中声明清扫器:

代码语言:javascript
复制
class ApplicationController < ActionController::Base
  cache_sweeper :my_sweeper
end

为什么会这样呢?观察者不是要观察模型并采取行动吗?控制器不应该知道缓存何时到期或是什么原因造成的吗?

澄清

我对将清除器设置为观察者的理解是,它意味着“在所有情况下,当更新MyModel时,运行此清除代码”。

  1. 这准确吗?
  2. 如果是这样,那么为什么cache_sweeper :my_sweeper也需要在控制器中声明呢?那有什么用?
EN

回答 1

Stack Overflow用户

发布于 2012-05-09 21:57:12

从缓存清扫器文档:

清除器是缓存世界的终止器,当模型对象更改时,它负责过期的缓存。 他们通过半观察者、半过滤器和为两种角色实现回调来做到这一点。

清扫器使用控制器来过期缓存,获取缓存设置等等。请看一下源代码。因此,缓存清除器允许我们从控制器端控制缓存。我认为这很好,因为我们可以在任何事件上终止缓存--更改DB或用户登录,或者其他任何东西。

我认为,如果不想在控制器中调用cache_sweeper方法,可以在扫查器中定义controller方法。我没有测试下面的代码,但是它应该能工作,因为我在我的扫掠器规范中做了同样的事情。

代码语言:javascript
复制
class MySweeper < ActionController::Caching::Sweeper
  observe MyModel

  def after_update(my_model)
    expire_page(...)
  end

  def controller
    @controller ||= ActionController::Base.new
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10521647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档