Question

J'ai une application qui utilise caches_page pour certains contrôleurs / actions. Pour expirer le cache, j'utilise un balayeur. Dans l'ensemble, c'est une solution standard.

Cependant, parce que certaines modifications peuvent provoquer un peu une ruée de demandes sur le serveur (parce que les notifications push sont envoyées et peuvent déclencher des appareils clients pour récupérer de nouvelles données), je voudrais pouvoir prévoir le cache, donc Il est prêt avant que les demandes ne roulent. Je pouvais juste attendre la première demande d'écrire automatiquement le cache, bien sûr, mais dans ce cas, je connaître Que les demandes viendront, pour qu'il y en ait beaucoup et qu'ils pourraient être presque simultanés. Je voudrais donc avoir le cache prêt.

Pour ajouter une certaine complexité, les mises à jour sont effectuées via une page Web normale et gérées dans un contrôleur standard, principalement échafaudé, tandis que la "page" que je veux mettre en cache est la réponse JSON pour un contrôleur entièrement différent qui sert d'API.

Alors, comment puis-je, à partir d'une balayeuse (ou du contrôleur, manipulant la mise à jour expirante du cache) déclenche un nouveau cache de page à écrire immédiatement?

Une autre façon de le dire pourrait être: comment faire une demande interne d'un contrôleur à un autre?


Edit: a fini par faire quelque chose comme ce que vous voyez ci-dessous. Ce n'est pas terriblement élégant, mais c'est efficace

class ModelSweeper < ActionController::Caching::Sweeper
  observe Model

  def after_create(model)
    expire_pages_for(model)
  end

  def after_update(model)
    expire_pages_for(model)
  end

  def after_destroy(model)
    expire_pages_for(model)
  end

  protected

    def expire_pages_for(model)
      # expire index page
      expire_and_bake(models_url)

      # expire show page
      expire_and_bake(model_url(model))
    end

    def expire_and_bake(url)
      # extract the path from the URL
      path = url.sub(%r{\Ahttp://[^/]+}, "")

      # expire the cache
      expire_page(path)

      # request the url (writes a new cache)
      system "curl '#{url}' &> /dev/null &"
    end

end

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top