为什么需要在控制器中声明缓存清理程序



缓存清理器是一个观察者,在它正在观察的模型上有一些钩子:

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更新时,运行此清理代码"

  1. 这准确吗?
  2. 如果是这样,那么为什么还需要在控制器中声明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

相关内容

  • 没有找到相关文章

最新更新