2010-02-11 4 views
4

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

# 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 

Как я знаю, что это не истекающий в том, что полный отчет возвращает старые данные, и реагирует почти мгновенно. Странно, правда?

+0

Любые мысли вообще? .... кто-нибудь? :-) – btelles

ответ

5

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

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

+0

Поздравляю господина Мэдсена. Уборочная машина Cache была на самом деле не в том месте. Спасибо за совет! – btelles

0

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

уборщик должен стрелять независимо от действия full_report, так что если вы сделаете изменения в компании, вы должны увидеть огонь отладчика (который, похоже, происходит правильно). Затем вам не нужно запускать действие full_report, поэтому на этом этапе вы можете проверить, что кешированный файл был удален. Было бы полезно пройти через expire_action в отладчике, чтобы узнать, пропускает ли рельсы истечение по другой причине.


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

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

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

+0

спасибо за советы ... помимо того, что вы просили меня сделать, какая дополнительная информация, по вашему мнению, может помочь нам разобраться с проблемой? – btelles

+0

мой комментарий не подходил! Я принял свой ответ :) – joshsz