Срок действия кэширования действий истекает некорректно, даже когда я вижу, что оно вызывается
-
20-09-2019 - |
Вопрос
У меня есть программа очистки, у которой должно истечь несколько кэшей действий.Несмотря на то, что отладчик останавливается непосредственно перед вызовом expire_action, на самом деле действие не заканчивается.Есть какие-нибудь идеи, что могло бы происходить?
Вот соответствующие уборочная машина и контроллер.
#company_sweeper.rb (в каталоге "модели")
class CompanySweeper < ActionController::Caching::Sweeper
observe Company
def after_save(company)
expire_cache(company) if company.final_save && company.valid?
end
def expire_cache(company)
debugger <= #debugger stops here!
right before the call
I'm trying to make.
expire_action :controller => 'reports',
:action => 'full_report'
end
end
#отчеты_контроллера.rb
class ReportsController < ApplicationController
layout false
caches_action :full_report, :supplier_list, :service_categories
cache_sweeper :company_sweeper
def full_report
#do stuff...
end
end
Насколько я знаю, срок его действия не истекает, так это то, что полный отчет возвращает старые данные и реагирует почти мгновенно.Странно, правда?
Решение
У вас есть cache_sweeper
декларация в вашем CompaniesController тоже есть?Уборочная машина должна быть включена в контроллер, который выполняет действия жизненного цикла для рассматриваемой модели.Если вы не выполняете какие-либо действия с экземплярами Company в ReportsController, cache_sweeper
линии там не место.
Кэширование действий включает в себя неявное имя хоста.Если два обращения поступают на разные имена хостов, кэширование выполняется под одним, а срок действия - под другим.
Другие советы
Я не думаю, что здесь достаточно подробностей, чтобы действительно ответить на ваш вопрос, но вот несколько вопросов:
Отладчик должен запускаться независимо от действия full_report , поэтому, если вы вносите изменения в Компанию, вы должны увидеть запуск отладчика (который, похоже, происходит правильно).После этого вам не нужно запускать действие full_report , поэтому на этом этапе вы можете убедиться, что кэшированный файл был удален.Может быть полезно выполнить пошаговое выполнение expire_action в отладчике, чтобы увидеть, пропускает ли rails истечение срока действия по какой-либо другой причине.
Редактировать:о, вы знаете что, я только что покопался в этом, и, похоже, ожидается, что expire_action будет выполняться в контексте контроллера (я читал исходный код gem в actionpack).Предполагается, что 'self' - это контроллер, поэтому ваш ввод параметра :controller игнорируется.
Другие примеры дают конкретную строку вместо параметров (например expire_action '/reports/full_report'
) Лично мне это не нравится - это не использование маршрутизатора - но, похоже, это сработало бы.
Возможно, вам следует переключиться на этот метод, убедиться, что он работает, а затем в отладчике посмотреть, есть ли у вас доступ к url_for.это могло бы быть так просто, как expire_action url_for(:controller => 'reports', :action => 'full_report')