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

StackOverflow https://stackoverflow.com/questions/2247410

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top