Domanda

Ho una spazzatrice che dovrebbe scadere un paio di cache di azione. Anche se il debugger arresta immediatamente prima della chiamata a expire_action, in realtà non è in scadenza l'azione. Qualsiasi idea di quello che potrebbe essere in corso?

Ecco la spazzatrice e il controller in questione.

# company_sweeper.rb (nella directory 'modelli')

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

Il modo in cui so che non è in scadenza è che il rapporto completo ritorna vecchi dati, e risponde quasi istantaneamente. Strano, vero?

È stato utile?

Soluzione

Hai una dichiarazione cache_sweeper nel vostro CompaniesController, troppo? La spazzatrice deve essere incluso nel controller che esegue azioni del ciclo di vita sul modello in questione. A meno che non si fanno le cose con le istanze aziende in ReportsController, la linea cache_sweeper non appartiene lì.

Azione caching include un nome host implicita. Se i due colpi sono in arrivo su diversi nomi host, il caching è fatto sotto lo stesso e la scadenza in uno diverso.

Altri suggerimenti

Non credo che ci siano abbastanza dettagli qui per rispondere realmente alla tua domanda, ma qui ci sono alcune domande:

La spazzatrice dovrebbe sparare in modo indipendente dall'azione full_report, quindi se si apporta una modifica a una società, si dovrebbe vedere il fuoco debugger (che sembra che sta accadendo in modo corretto). Non è quindi necessario eseguire l'azione full_report, quindi a questo punto si potrebbe verificare il file memorizzato nella cache è stato rimosso. Potrebbe essere utile fare un passo attraverso expire_action nel debugger per vedere se le rotaie è saltare la scadenza per qualche altra ragione.


EDIT: oh sai cosa, stavo solo diggging in questo, e sembra come expire_action è previsto per l'esecuzione in contesto di un controllore (stavo leggendo la fonte gioiello in actionpack). Si presuppone 'sé' è un controller, in modo che il passaggio nell'opzione:. Controller viene ignorato

Altri esempi danno una stringa specifica, invece di opzioni (ad esempio expire_action '/reports/full_report') Non mi piace che personalmente --- non sta usando il router --- ma sembra che avrebbe funzionato.

Forse si dovrebbe passare a questo metodo, assicurarsi che funzioni, e poi nel debugger vedere se si ha accesso url_for. potrebbe essere semplice come expire_action url_for(:controller => 'reports', :action => 'full_report')

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top