2

memcached 付きの dalli gem を使用します。次のコードは、複数のページにわたってページ分割された Foo オブジェクトをキャッシュします。特定のページ (2 または 10 または 15 など) にいるときに Foo(s) をキャッシュできます。しかし、15 ページの Foo (たとえば Foo-150) を変更すると、FooSweeper のメソッドを使用してすべてのオブジェクトのキャッシュがクリアされます。上記のアクションが発生したときに after_save メソッドが呼び出されていますが、すべてのページのキャッシュがクリアされておらず、要求されたページの古い値が反映されています。

以下のコード スニペットに誤りはありますか。

私のコントローラはこのように見えます..

class FooController 

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

...

私のスイーパーコードは次のようになります..

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
4

1 に答える 1

0

コントローラーは Foo と呼ばれますが、スイーパーから controller: 'foos' を呼び出します。キャッシュが適切にクリアされていないことが原因である可能性があります。

これは、foos を foo に変更することで修正できます。

于 2013-06-01T21:51:58.857 に答える