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

CompaniesControllerにもcache_sweeper宣言がありますか?スイーパーは、問題のモデルでライフサイクルアクションを実行するコントローラーに含まれている必要があります。ReportsControllerでCompanyインスタンスを使用しない限り、そのcache_sweeper行はそこに属していません。

アクションキャッシングには、暗黙のホスト名が含まれます。2つのヒットが異なるホスト名で発生している場合、キャッシュは1つで実行され、有効期限は別のホスト名で実行されます。

于 2010-02-16T17:45:48.840 に答える
0

あなたの質問に本当に答えるのに十分な詳細がここにあるとは思いませんが、ここにいくつかの質問があります:

スイーパーは full_report アクションとは独立して起動する必要があるため、Company に変更を加えると、デバッガーが起動するはずです (正しく発生しているように見えます)。その後、full_report アクションを実行する必要がないため、この時点で、キャッシュされたファイルが削除されたことを確認できます。Rails が何らかの理由で有効期限をスキップしているかどうかを確認するには、デバッガーで expire_action を実行すると便利です。


EDIT:ああ、私はこれを掘り下げていたのですが、expire_actionはコントローラーのコンテキストで実行されることが期待されているようです(私はアクションパックの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 に答える