アクションのキャッシングは、私はそれが呼ばれています見ることができた場合でも、正しく期限切れされていません

StackOverflow https://stackoverflow.com/questions/2247410

質問

私はいくつかのアクションのキャッシュを有効期限が切れることになっていますスイーパーを持っています。デバッガが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ラインが属していません。

アクションのキャッシュは、暗黙的なホスト名が含まれています。 2件のヒットが異なるホスト名に着信している場合、キャッシュは異なるものの下に1と有効期限の下で行われます。

他のヒント

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

あなたが会社を変更した場合、あなたは(それが正確に何が起こっているように見える)デバッガの火を参照してくださいする必要がありますので、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