Могут ли подметальные машины Rails работать в разных контроллерах?
-
12-10-2019 - |
Вопрос
У меня есть кэширование действий, работающее над моим индексом сайтов, и я настраиваю щипца сайта, который работает нормально:
# 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
Но я также хочу истекать срок действия /администратора /сайтов, когда какие -либо издатели сохраняются или уничтожены. Можно ли истечь издательский индекс сайтов с чем -то подобным?
# 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
Я знаю, что могу просто позвонить срок действия истечения срока действия '/admin/sites' в различных действиях издателя. Мне просто интересно, есть ли у подметателей эту возможность (чтобы мои контроллеры были немного чище).
Решение
Одна подметалка может наблюдать за многими моделями, и любой контроллер может иметь несколько подметальных машин.
Я думаю, что вы должны изменить свою логику, чтобы использовать что -то подобное:
class SiteSweeper < ActionController::Caching::Sweeper
observe Site, Publisher
(…)
end
На PublishersController
cache_sweeper :site_sweeper, :admin_sweeper
Таким образом, вы не повторяете логику очистки /администратора /сайта. Назовите это Admin Sweeper, поэтому, когда что -то пойдет не так, вы знаете единственное место, которое истекло действие «/Admin/Sites».