2010-12-01 8 views
1

私はカスタムアクションを持つ豊富なコントローラを手に入れました。アクションはかなり重いですので、私はそれをキャッシュに取り組んでいます:コントローラ上のすべてのキャッシュの期限切れ

それはとても素敵な作品
class MyController < ApplicationController 
    caches_action :walk_to_mordor 

    # GET /my/:id/walk_to_mordor/:direction 
    def walk_to_mordor 
    # srz bzns 
    end 
end 

は、キャッシングが行われ、ページが高速です。しかし、私は、ユーザーがページ上のリンクをクリックすることでキャッシュを "破棄"できるようにしたいと考えています。最初に私は試しました:

def bust_cache 
    expire_action :action => :walk_to_mordor 
end 

Railsは自分の行動に合ったルートがないと訴えました。パラメータが原因である可能性があります。うーん、のは彼にそれを与えてみましょう:

def bust_cache 
    MyEntities.all.each do |e| 
    expire_action walk_to_mordor_path(e, ??) 
    end 
end 

問題を、私はおそらく:directionのすべての選択肢を識別することはできません。

特定の正規表現に一致するすべてのアクションキャッシュ、または特定のコントローラのすべてのアクションキャッシュをクリアする方法はありますか?

+0

単純にモルドール – Alejo

答えて

2

秘密がexpire_fragmentと呼ばれている:

expire_fragment(キー、オプション= nilの)

がキャッシュからフラグメントを削除します。 - これは通常、「ページ/ 45 /ノート」のように、パスの形を取る

  • 文字列:

    キーは3つの形式を取ることができます。

  • ハッシュ - {:controller => "pages", :action => "notes", :id => 45}

  • 正規表現のように、url_forへの暗黙的な呼び出しとして扱われるが - 一致する任意のフラグメントを削除しますので、%r{pages/d*/notes}は、すべてのノートを削除することがあります。正規表現でアンカーを使用しないようにしてください(^または$)。一致する実際のファイル名は./cache/filename/path.cacheのように見えます。注:Regexpの有効期限は、(memcachedとは異なり)すべてのキーに対して反復可能なキャッシュでのみサポートされています。悲しいことに

http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html#method-i-expire_fragment

(私が今までそれを使用することにした場合)、それはmemcachedのでは動作しません。その周回でキャッシュを避けるためにもっと巧みになるべきです。場合によってはserialパラメータをリクエストに追加し、ユーザーが 'バストキャッシュ'ボタンを押したときにインクリメントします。

関連する問題