Почему очистители кэша должны быть объявлены в контроллерах?
Подметальная машина кэша - это наблюдатель с некоторыми хуками на модели, которую он наблюдает:
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
также должны быть объявлены в контроллере? Что это делает?
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