Le travail de Rails Can sur différents contrôleurs?
-
12-10-2019 - |
Question
Je cache d'action travailler sur mon index des sites, et mis en place un SiteSweeper qui fonctionne très bien:
# 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
Mais je veux aussi expirer / admin / sites chaque fois les éditeurs sont enregistrés ou détruits. Est-il possible d'avoir un PublisherSweeper expire l'index des sites avec quelque chose comme ça?
# 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
Je sais que je peux appeler expire_action « / admin / sites » dans les différentes actions de l'éditeur. Je me demande si les balayeuses ont cette capacité (pour garder mes contrôleurs un peu plus propre).
La solution
Une balayeuse peut observer de nombreux modèles, et un contrôleur peut avoir plusieurs balayeuses.
Je pense que vous devriez changer votre logique d'utiliser quelque chose comme ça:
class SiteSweeper < ActionController::Caching::Sweeper
observe Site, Publisher
(…)
end
PublishersController
cache_sweeper :site_sweeper, :admin_sweeper
Alors vous ne répétez pas la logique de nettoyage de la / admin / site. Appelez-AdminSweeper, donc quand quelque chose va mal vous savez le seul endroit qui a expiré le « / admin / sites » action.