il valore ETag male in ambiente di test e di produzione
-
21-09-2019 - |
Domanda
sto usando la nuova soluzione di caching per Rails come descritto qui .
Il sviluppo ambiente funziona bene, ma il test e di produzione manda un colpo di testa ETag
valida ignora il parametro della funzione stale?
.
Ecco è la parte corrispondente di uno dei miei controllori:
def index
@categories = Category.all
if stale?(:etag => @categories)
respond_to do |format|
format.html
format.xml { render :xml => @categories }
format.json { render :json => @categories }
end
end
end
Il metodo stale?
del ActionController::Base
chiama il metodo fresh_when
che imposta la etag
dell'oggetto Response
, che ha il seguente codice:
def etag=(etag)
if etag.blank?
headers.delete('ETag')
else
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
end
end
Il modello Category
invia il cache_key
corretto se ho capito in ogni ambiente:
>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"
Così ho semplicemente non capisco cosa sta succedendo, perché quando seleziono il http://localhost:3000/admin/categories/
URL con il sviluppo l'ambiente, la ETag
cambia ogni volta quando salvo su un Category
ma con Test o di produzione non è così.
Ho provato con webrick e sottile
Soluzione
la soluzione era che il metodo Category.all
in cache i risultati sul livello di classe, quindi una volta che è stato recuperato tutto è stato memorizzato nella cache per il resto delle richieste.
non è stato lì in sviluppo ambiente, perché ogni volta che il modello è stato ricaricato perché in quell'ambiente il config.cache_classes
era false
!
Altri suggerimenti
Non so se esista un massimo di intestazione linee / parametri, ma con un sacco di categorie del valore ETag diventa molto lungo, come il tuo esempio mostra già.
Invece di creare una grande stringa contenente tutti di creazione / date modificate, si potrebbe trovare l'ultima data di modifica e l'uso che per un ETag.
Inoltre l'articolo che hai citato utilizza fresh?
invece di stale?
tra cui alcuni altri metodi. Perché non usare quelle?
Modifica Quando si osserva l'articolo nel tuo collegamento aggiornato la soluzione sembra essere, di compilare un solo @category
(lo stesso come fanno). Pertanto trovare l'ultima categoria modificato
@category = Category.find(:first, :order => 'date DESC')
e utilizzare questo valore per generare il MD5 per l'ETag.
Ottenere l'elenco completo dei @categories
solo se si è il rendering della pagina.