我有一个本应到期的几个动作缓存清道夫。即使调试器会立即停止该呼叫之前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

我知道这是不是过期的方式是,报告全文返回旧数据,并响应几乎瞬间。奇怪的,是吗?

有帮助吗?

解决方案

你有你的CompaniesController一个cache_sweeper声明吗?清扫机必须包含在执行上有问题的模型的生命周期动作控制器。除非你做的事情,在ReportsController公司情况下,cache_sweeper行不属于那里。

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

其他提示

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

在清扫车应该从full_report行动独立防火,所以如果你改变一个公司,你应该看到调试器火(这看起来是正确的事情)。你不那么需要运行full_report动作,所以在这一点上,你可以验证缓存的文件已被删除。这可能是有用的,通过expire_action在调试步骤,以查看是否轨道被跳过期满由于某些其他原因。


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

其他的例子给出一个具体的字符串,而不是选项(例如expire_action '/reports/full_report')我不喜欢那个人---它不使用路由器---但现在看来似乎是可行的。

也许你应该切换到该方法,确保它的工作原理,然后在调试器中看到,如果你有机会获得url_for。它可能是如expire_action url_for(:controller => 'reports', :action => 'full_report')简单

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top