Могут ли рельсы подметать на разных контроллерах?

У меня есть кэширование действий, работающее с моим индексом сайтов, и я настроил 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' в рамках различных действий Publisher. Мне просто интересно, есть ли у подметальных машин такая возможность (чтобы мои контроллеры были немного чище).

1 ответ

Решение

Один уборщик может наблюдать много моделей, а любой контроллер может иметь несколько уборщиков.

Я думаю, что вы должны изменить свою логику, чтобы использовать что-то вроде этого:

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

На издателяхКонтроллер

  cache_sweeper :site_sweeper, :admin_sweeper

Таким образом, вы не повторяете логику очистки / admin / сайта. Назовите его AdminSweeper, поэтому, когда что-то идет не так, вы знаете единственное место, в котором истекло действие "/ admin / sites".

Другие вопросы по тегам