Кэширование действий не истекает правильно, даже когда я вижу, что оно вызывается
У меня есть подметальная машина, срок действия которой должен истечь, несколько кешей действий. Даже если отладчик останавливается непосредственно перед вызовом expire_action, на самом деле действие не заканчивается. Есть идеи, что может происходить?
Вот соответствующие уборочная машина и контроллер.
# company_sweeper.rb (в каталоге 'models')
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
# reports_controller.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
Я знаю, что срок его действия не истекает - полный отчет возвращает старые данные и реагирует практически мгновенно. Странно, правда?
2 ответа
У вас есть cache_sweeper
декларации в вашем CompaniesController тоже? Подметальная машина должна быть включена в контроллер, который выполняет действия жизненного цикла на рассматриваемой модели. Если вы не делаете что-то с экземплярами Компании в 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')