Rails 3.2: pre-render (cottura) Una nuova cache di pagina immediatamente dopo la scadenza?
-
12-11-2019 - |
Domanda
Ho un'applicazione che utilizza caches_page
per alcuni controller/azioni. Per scadere la cache, uso uno spazzino. Tutto sommato, è una soluzione standard.
Tuttavia, poiché alcune modifiche possono causare un po 'di fretta sul server (poiché le notifiche push vengono inviate e possono innescare dispositivi client per recuperare nuovi dati), mi piacerebbe essere in grado di prevedere la cache, quindi È pronto prima che le richieste arrivino. Potrei semplicemente aspettare la prima richiesta per scrivere automaticamente la cache, ovviamente, ma in questo caso, io sapere che le richieste arriveranno, che potrebbero esserci molte e che potrebbero essere quasi stimolanti. Quindi mi piacerebbe avere la cache pronta.
Per aggiungere un po 'di complessità, gli aggiornamenti vengono eseguiti tramite una normale pagina Web e gestiti in un controller standard, per lo più impalcati, mentre la "pagina" che voglio memorizzare nella cache è la risposta JSON per un controller completamente diverso che funge da API.
Quindi, come faccio, da uno spazzino (o dal controller che gestisce l'aggiornamento che espira la cache) attiva una nuova cache di pagina da scrivere immediatamente?
Un altro modo per dirlo potrebbe essere: come faccio una richiesta interna da un controller all'altro?
EDIT: Finisci per fare qualcosa come quello che vedi di seguito. Non è terribilmente elegante, ma è 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
Nessuna soluzione corretta