Pregunta

Estoy usando la nueva solución de almacenamiento en caché de los carriles como se describe aquí .

La Desarrollo entorno funciona bien, pero el test y producción envía encabezado ETag inválida ignora el parámetro de la función stale?.

Aquí está es la parte correspondiente de una de mis controladores:

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

El método stale? de la ActionController::Base llama al método fresh_when que establece el etag del objeto Response, que tiene el siguiente código:

def etag=(etag)
  if etag.blank?
    headers.delete('ETag')
  else
    headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
  end
end

El modelo Category envía el cache_key correcta si lo consigo en todos los ambientes:

>> 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"

Así que simplemente no entiendo lo que está pasando, porque cuando selecciono la http://localhost:3000/admin/categories/ URL con el Desarrollo medio ambiente, la ETag cambia cada vez que puedo guardar en un Category pero con test o producción no lo hace.

Lo he probado con WEBrick y delgada

¿Fue útil?

Solución

la solución era que el método Category.all almacena en caché los resultados en el nivel de clase, por lo que una vez que se fue a buscar todo lo que se almacena en caché para el resto de las solicitudes.

que no estaba allí en Desarrollo medio ambiente porque cada vez que el modelo se vuelve a cargar, porque en ese ambiente era el config.cache_classes false!

Otros consejos

No sé si hay un máximo de cabecera líneas / parámetros, pero con una gran cantidad de categorías el valor ETag se hace muy larga, como su ejemplo ya muestra.

En lugar de crear una gran cadena que contiene todas las fechas de modificación / creación, se puede encontrar la última fecha de modificación y el uso que para un ETag.

Además el artículo que citan utiliza fresh? en lugar de stale? incluyendo algunos otros métodos. ¿Por qué no aprovechan esos?

Editar Al mirar el artículo en su enlace actualizado la solución parece ser, para llenar en un solo @category (igual que lo hacen). Por lo tanto encontrar la última categoría modificado

@category = Category.find(:first, :order => 'date DESC')

y utilizar este valor para generar el MD5 para la ETag.
Obtener la lista completa de @categories sólo si se renderiza la página.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top