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

我知道它不会过期的方式是完整的报告会返回旧数据,并且几乎可以立即做出响应。很奇怪,对吧?

4

2 回答 2

5

cache_sweeper您的 CompaniesController 中是否也有声明?清扫器必须包含在对相关模型执行生命周期操作的控制器中。除非您在 ReportsController 中使用 Company 实例,否则该cache_sweeper行不属于那里。

动作缓存包括一个隐含的主机名。如果两个命中来自不同的主机名,则缓存在一个下完成,到期在另一个下完成。

于 2010-02-16T17:45:48.840 回答
0

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

清扫器应该独立于 full_report 操作触发,因此如果您对公司进行更改,您应该会看到调试器触发(看起来正确发生)。然后您不需要运行 full_report 操作,因此此时您可以验证缓存文件已被删除。在调试器中单步执行 expire_action 以查看 rails 是否由于其他原因而跳过到期可能很有用。


编辑:哦,你知道吗,我只是在研究这个,看起来 expire_action 应该在控制器的上下文中运行(我正在阅读 actionpack 中的 gem 源代码)。它假设 'self' 是一个控制器,所以你传入的选项 :controller 被忽略了。

其他示例给出了一个特定的字符串而不是选项(例如expire_action '/reports/full_report')我个人不喜欢那个——它没有使用路由器——但它似乎可以工作。

也许您应该切换到该方法,确保它有效,然后在调试器中查看您是否可以访问 url_for。它可能很简单expire_action url_for(:controller => 'reports', :action => 'full_report')

于 2010-02-15T17:32:26.733 回答