缓存清理程序是一个观察者,它正在观察的模型上有一些钩子:
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
也需要在控制器中声明?那是做什么的?答案 0 :(得分:1)
来自缓存清扫器文档:
扫地机是缓存世界的终结者并负责 模型对象更改时到期缓存。
他们通过半观察者,半过滤器和两个角色的回调来实现这一目标。
Sweeper使用控制器使缓存失效,获取缓存设置等。看看source code。因此,缓存清扫器允许我们从控制器端控制缓存。我认为这很好,因为我们可以在任何事件上过期缓存 - 更改数据库或用户登录,或其他任何事情。
我认为,如果您不想在控制器中调用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