2

サイトインデックスでアクションキャッシングが機能していて、正常に機能するSiteSweeperを設定しています。

# app/controllers/admin/sites_controller.rb
class Admin::SitesController < Admin::BaseController
  cache_sweeper :site_sweeper, :only => [:create, :update, :destroy]
  caches_action :index, :cache_path => '/admin/sites'
  ...

# app/sweepers/site_sweeper.rb
class SiteSweeper < ActionController::Caching::Sweeper
  observe Site

  def after_save(site)
    expire_cache(site)
  end

  def after_destroy(site)
    expire_cache(site)
  end

  def expire_cache(site)
    expire_action '/admin/sites'
  end
end

ただし、パブリッシャーが保存または破棄されるたびに/ admin/sitesを期限切れにしたいです。PublisherSweeperにこのようなものでサイトインデックスを期限切れにすることは可能ですか?

# app/sweepers/publisher_sweeper.rb
class PublisherSweeper < ActionController::Caching::Sweeper
  observe Publisher

  def after_save(publisher)
    expire_cache(publisher)
  end

  def after_destroy(publisher)
    expire_cache(publisher)
  end

  def expire_cache(publisher)
    expire_action '/admin/sites'
  end
end

さまざまなパブリッシャーアクション内でexpire_action'/admin/sites'を呼び出すことができることを知っています。スイーパーにこの機能があるかどうか疑問に思っています(コントローラーを少しきれいに保つため)。

4

1 に答える 1

5

1つのスイーパーで多くのモデルを監視でき、どのコントローラーでも複数のスイーパーを持つことができます。

次のようなものを使用するようにロジックを変更する必要があると思います。

class SiteSweeper < ActionController::Caching::Sweeper
  observe Site, Publisher
  (…)
end

PublishersControllerで

  cache_sweeper :site_sweeper, :admin_sweeper

したがって、/ admin/siteをクリーニングするロジックを繰り返さないでください。それをAdminSweeperと呼びます。これにより、問題が発生したときに、「/ admin/sites」アクションが期限切れになった場所が1つだけわかります。

于 2010-12-22T17:25:29.937 に答える