缓存清扫器是在它所观察的模型上有一些钩子的观察者:
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也需要在控制器中声明呢?那有什么用?发布于 2012-05-09 21:57:12
从缓存清扫器文档:
清除器是缓存世界的终止器,当模型对象更改时,它负责过期的缓存。 他们通过半观察者、半过滤器和为两种角色实现回调来做到这一点。
清扫器使用控制器来过期缓存,获取缓存设置等等。请看一下源代码。因此,缓存清除器允许我们从控制器端控制缓存。我认为这很好,因为我们可以在任何事件上终止缓存--更改DB或用户登录,或者其他任何东西。
我认为,如果不想在控制器中调用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
endhttps://stackoverflow.com/questions/10521647
复制相似问题