2010-02-11 92 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 2010-02-12 19:05:32

回答

5

你的公司控制器也有cache_sweeper声明吗?清扫车必须包含在对相关车型执行生命周期操作的控制器中。除非您在ReportsController中使用Company实例执行操作,否则cache_sweeper行不属于此行。

动作缓存包含隐式主机名。如果这两个命中是在不同的主机名上进行的,则高速缓存将在一个不同的主机名下完成并到期。

+0

恭喜先生马德森。 Cache扫除机实际上是在错误的地方。谢谢你的提示! – btelles 2010-02-16 21:21:43

0

我不认为这里有真正回答你的问题足够的细节,但这里有一些问题:

清扫机,应该从full_report行动独立防火,所以如果你改变一个公司,你应该看到调试器激活(它看起来像是正确地发生)。然后您不需要运行full_report操作,因此此时您可以验证已删除缓存的文件。在调试器中遍历expire_action来查看rails是否因其他原因而跳过到期会很有用。


编辑: 哦,你知道吗,我只是diggging成这样了,它看起来像expire_action有望在控制器的上下文中运行(我是读ActionPack的宝石源)。它假定“自我”是一个控制器,所以你在选项:控制器中的传递被忽略。

其他例子给出了一个特定的字符串,而不是选项(例如expire_action '/reports/full_report')我不喜欢那个人---它不使用路由器---但它看起来像它会工作。

也许你应该切换到该方法,确保它能正常工作,然后在调试器中查看是否有权访问url_for。它可以像expire_action url_for(:controller => 'reports', :action => 'full_report')

+0

感谢您的提示......除了您要求我做的之外,您认为哪种附加信息可以帮助我们找出问题所在? – btelles 2010-02-15 23:41:19

+0

我的评论无法适应!我已经赞赏我的回答:) – joshsz 2010-02-16 14:52:34

相关问题