Почему очистители кэша должны быть объявлены в контроллерах?

Подметальная машина кэша - это наблюдатель с некоторыми хуками на модели, которую он наблюдает:

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 также должны быть объявлены в контроллере? Что это делает?

1 ответ

Из документации кеша:

Подметальные машины являются ограничителями мира кэширования и отвечают за истечение срока действия кэшей при изменении объектов модели.

Они делают это, будучи наполовину наблюдателями, наполовину фильтруя и осуществляя обратные вызовы для обеих ролей.

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
Другие вопросы по тегам