缓存清理器是一个观察者,在它正在观察的模型上有一些钩子:
class MySweeper < ActionController::Caching::Sweeper
observe MyModel
def after_update(my_model)
expire_page(...)
end
end
但文档和指南也说要在控制器中声明清扫器:
class ApplicationController < ActionController::Base
cache_sweeper :my_sweeper
end
这是为什么呢?观察者的重点难道不是观察模型并采取行动吗?控制器不应该知道缓存何时过期或导致缓存的原因吗?
澄清
我对将清理器设置为观察者的理解是,这意味着"在所有情况下,当MyModel更新时,运行此清理代码"
- 这准确吗?
- 如果是这样,那么为什么还需要在控制器中声明
cache_sweeper :my_sweeper
?这是做什么的?
从缓存清理器文档中:
扫地机是缓存世界的终结者,负责 模型对象更改时过期的缓存。
他们通过作为半观察者、半过滤器并为两个角色实现回调来做到这一点。
Sweeper 使用控制器使缓存过期、获取缓存设置等。看看源代码。因此,缓存清理程序允许我们从控制器端控制缓存。我认为这很好,因为我们可以在任何事件上使缓存过期 - 数据库或用户登录的更改,或其他任何事情。
我认为,如果您不想在控制器中调用cache_sweeper
方法,则可以在清扫器中定义controller
方法。我没有测试以下代码,但它应该可以工作,因为我在我的清扫器规范中做了同样的事情。
class MySweeper < ActionController::Caching::Sweeper
observe MyModel
def after_update(my_model)
expire_page(...)
end
def controller
@controller ||= ActionController::Base.new
end
end