我有个清扫器,可以让几个动作缓存过期。即使调试器在调用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我知道它不会过期的方法是,完整的报告返回旧数据,并且几乎是即时响应。很奇怪,对吧?
发布于 2010-02-17 01:45:49
您的CompaniesController中也有cache_sweeper声明吗?清扫器必须包含在对相关模型执行生命周期操作的控制器中。除非您在ReportsController中使用Company实例,否则cache_sweeper行不属于那里。
操作缓存包括隐式主机名。如果两次命中来自不同的主机名,则在一个主机名下缓存,在另一个主机名下过期。
发布于 2010-02-16 01:32:27
我不认为这里有足够的细节来真正回答你的问题,但这里有一些问题:
清除器应该独立于full_report操作触发,因此如果您对一家公司进行了更改,您应该会看到调试器触发(它看起来像是正确发生的)。然后,您不需要运行full_report操作,因此此时您可以验证缓存的文件是否已被删除。在调试器中单步执行expire_action以查看rails是否由于其他原因跳过了过期,这可能很有用。
编辑:哦,你知道吗,我正在深入研究这个问题,看起来expire_action应该在控制器的上下文中运行(我正在阅读actionpack中的gem源代码)。它假设'self‘是一个控制器,所以你传入的option : controller会被忽略。
其他例子给出了一个特定的字符串,而不是选项(例如expire_action '/reports/full_report')我个人不喜欢这样-它没有使用路由器-但它似乎可以工作。
也许您应该切换到该方法,确保它正常工作,然后在调试器中查看您是否有权访问url_for。它可以像expire_action url_for(:controller => 'reports', :action => 'full_report')一样简单
https://stackoverflow.com/questions/2247410
复制相似问题