2013-04-16 5 views
2

우리는 memcached가있는 dalli gem을 사용합니다. 다음 코드는 여러 페이지에 걸쳐 페이지가 매겨진 Foo 객체를 캐시합니다. 특정 페이지 (예 : 2 또는 10 또는 15)에있을 때 Foo (s)를 캐싱 할 수 있습니다. 그러나 15 페이지의 Foo (Foo-150)를 수정하면 FooSweeper의 메소드를 사용하여 모든 객체의 캐시를 지 웁니다. 위의 동작이 발생하면 after_save 메서드가 호출되지만 캐시는 모든 페이지에 대해 지워지지 않고 요청 된 페이지의 이전 값을 반영합니다.페이지 매김을 사용할 때 모든 페이지의 캐시를 지우는 방법

아래 주어진 코드 조각에 실수가 있습니까?

내 컨트롤러는

class FooSweeper < ActionController::Caching::Sweeper 
    observe :foo 

    def after_save(foo) 
    expire_cache(foo) 
    end 

    def before_destroy(foo) 
    expire_cache(foo) 
    end 

    def expire_cache(foo) 
    expire_action(:controller => 'foos', :action => 'index') 
    expire_action(:controller => 'foos', :action => 'index', :format => 'text/html') 
    end 
end 

답변

0

컨트롤러가 호출되어 푸입니다 ..

class FooController 

... 
    caches_action :index, cache_path: proc { |c| c.params.except(:_).merge(format: request.format) } 

... 

내 스위퍼 코드는 다음과 같습니다 .. 다음과 같다,하지만 당신은 컨트롤러를 호출 ', FOOS를'당신의 스위퍼에서 . 캐시가 제대로 지워지지 않은 이유가 될 수 있습니다.

foos를 foo로 변경하면 문제를 해결할 수 있습니다.