Azione caching non è in scadenza in modo corretto, anche se posso vedere è in fase di chiamata
-
20-09-2019 - |
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?
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')