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 

는 캐싱이 수행되며 페이지가 지금 빠릅니다. 그러나 사용자가 페이지의 링크를 클릭하여 캐시를 "버스트 (bust)"할 수있게하려고합니다. 처음에 나는 시도했다 :

def bust_cache 
    expire_action :action => :walk_to_mordor 
end 

레일스는 나의 행동과 일치하지 않는다고 불평했다. 매개 변수 때문일 수 있습니다. 흠, 이제 그에게 그것을 줄 수 있도록 :

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

문제, 나는 아마도 :direction의 모든 선택을 식별 할 수 없습니다.

특정 정규식과 일치하는 모든 동작 캐시 또는 특정 컨트롤러의 모든 동작 캐시를 지우는 방법이 있습니까?

+0

하나는 단순히 mordor – Alejo

답변

2

비밀은 expire_fragment 호출 :

expire_fragment (키 옵션 = 닐)

캐시에서 단편을 제거한다.

키는 세 가지 형태 중 하나를 취할 수 있습니다

  • 문자열 - 이것은 일반적으로 "페이지/45/노트"와 같은 경로의 형태를 취할 것입니다.

  • 해시 - url_for에 대한 암시 적 호출로 처리됩니다, {:controller => "pages", :action => "notes", :id => 45}

  • 정규 표현식 등 - 일치하는 모든 조각을 제거, 그래서 %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 매개 변수를 요청에 추가하고 사용자가 '버스트 캐시'버튼을 누를 때이를 증가시킵니다 ...

관련 문제