la mise en cache d'action ne sont pas correctement arrive à expiration, même quand je vois qu'il est appelé

StackOverflow https://stackoverflow.com/questions/2247410

Question

J'ai une balayeuse qui est censé expirer quelques caches d'action. Même si le débogueur arrête immédiatement avant l'appel à expire_action, il est expirant pas réellement l'action. Toute idée de ce qui pourrait se passer?

Voici la balayeuse et le contrôleur concerné.

# company_sweeper.rb (dans le répertoire 'modèles)

class CompanySweeper < ActionController::Caching::Sweeper
  observe Company

  def after_save(company)
    expire_cache(company) if company.final_save && company.valid?
  end

  def expire_cache(company)

    debugger                                              <= #debugger stops here!
                                                             right before the call
                                                             I'm trying to make.

    expire_action :controller => 'reports', 
                  :action => 'full_report'
  end
end

# reports_controller.rb

class ReportsController < ApplicationController
  layout false
  caches_action :full_report, :supplier_list, :service_categories
  cache_sweeper :company_sweeper

  def full_report
      #do stuff...
  end
end

La façon dont je sais que ce n'est pas arrivé à échéance est que le rapport complet retourne les anciennes données, et répond presque instantanément. Bizarre, non?

Était-ce utile?

La solution

Avez-vous une déclaration de cache_sweeper dans votre CompaniesController aussi? La balayeuse doit être inclus dans le contrôleur qui exécute des actions du cycle de vie sur le modèle en question. À moins que vous faites les choses avec les instances de l'entreprise dans ReportsController, la ligne de cache_sweeper ne leur appartient pas.

cache d'action comprend un nom d'hôte implicite. Si les deux coups arrivent sur les différents noms d'hôte, la mise en cache est effectuée sous une seule et sous expiration d'un autre.

Autres conseils

Je ne pense pas qu'il y ait suffisamment de détails ici pour répondre vraiment à votre question, mais voici quelques questions:

La balayeuse devrait tirer indépendamment de l'action de full_report, donc si vous apportez une modification à une entreprise, vous devriez voir le feu de débogage (ce qui ressemble se passe correctement). Vous n'avez pas besoin alors d'exécuter l'action full_report, donc à ce stade, vous pouvez vérifier le fichier mis en cache a été supprimé. Il pourrait être utile à l'étape par expire_action dans le débogueur pour voir si rails sautille l'expiration pour une autre raison.


EDIT: oh tu sais quoi, je ne faisais que diggging dans cela, et il semble que devrait expire_action de fonctionner dans le contexte d'un contrôleur (je lisais la source de pierres précieuses dans actionpack). Elle suppose « soi » est un contrôleur, de sorte que votre passage dans l'option. Contrôleur est ignoré

D'autres exemples donnent une chaîne spécifique au lieu d'options (par exemple expire_action '/reports/full_report') Je n'aime pas que personnellement --- il est de ne pas utiliser le routeur --- mais il semble que cela fonctionnerait.

Peut-être vous devriez passer à cette méthode, assurez-vous qu'il fonctionne, puis dans le débogueur si vous avez accès à url_for. il pourrait être aussi simple que expire_action url_for(:controller => 'reports', :action => 'full_report')

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