Кэширование действий не истекает правильно, даже когда я вижу, что оно вызывается - PullRequest
4 голосов
/ 11 февраля 2010

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

5 голосов
/ 16 февраля 2010

У вас также есть объявление cache_sweeper в вашем CompaniesController? Подметальная машина должна быть включена в контроллер, который выполняет действия жизненного цикла на рассматриваемой модели. Если вы не делаете что-то с экземплярами Company в ReportsController, строка cache_sweeper там не принадлежит.

Кэширование действий включает в себя неявное имя хоста. Если два попадания приходят на разные имена хостов, кэширование выполняется под одним, а срок действия - под другим.

0 голосов
/ 15 февраля 2010

Не думаю, что здесь достаточно подробностей, чтобы действительно ответить на ваш вопрос, но вот несколько вопросов:

Подметальная машина должна срабатывать независимо от действия full_report, поэтому, если вы вносите изменения в компанию, вы должны увидеть срабатывание отладчика (что, по-видимому, происходит правильно). Тогда вам не нужно запускать действие full_report, так что на этом этапе вы можете убедиться, что кэшированный файл был удален. Может быть полезно пройти через expire_action в отладчике, чтобы увидеть, пропускает ли rails срок действия по какой-либо другой причине.


EDIT: о, вы знаете что, я просто копался в этом, и похоже, что expire_action будет выполняться в контексте контроллера (я читал источник гемов в actionpack). Предполагается, что «self» является контроллером, поэтому передача вами параметра: controller игнорируется.

В других примерах вместо параметров указывается конкретная строка (например, expire_action '/reports/full_report'). Лично мне это не нравится - он не использует маршрутизатор - но похоже, что он будет работать.

Возможно, вам следует переключиться на этот метод, убедиться, что он работает, а затем в отладчике посмотреть, есть ли у вас доступ к url_for. это может быть так просто, как expire_action url_for(:controller => 'reports', :action => 'full_report')

...