Кэширование действий не истекает правильно, даже когда я вижу, что оно вызывается

У меня есть подметальная машина, срок действия которой должен истечь, несколько кешей действий. Даже если отладчик останавливается непосредственно перед вызовом 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')

Другие вопросы по тегам