valor de ETag mal en el entorno de prueba y producción
-
21-09-2019 - |
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
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.