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

È stato utile?

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.

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