Valor ETAG ruim no ambiente de teste e produção
-
21-09-2019 - |
Pergunta
Estou usando a nova solução de cache para trilhos, conforme descrito aqui.
o desenvolvimento o ambiente funciona bem, mas o teste e Produção envia inválido ETag
o cabeçalho ignora o parâmetro do stale?
função.
Aqui está a parte correspondente de um dos meus 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
o stale?
Método do ActionController::Base
chama o fresh_when
método que define o etag
do Response
objeto, que possui o seguinte 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
o Category
o modelo envia o correto cache_key
Se eu conseguir em todos os 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"
Então eu simplesmente não entendo o que está acontecendo, porque quando eu seleciono o URL http://localhost:3000/admin/categories/
com o desenvolvimento ambiente, o ETag
muda toda vez que eu salvo em um Category
mas com teste ou Produção isso não.
Eu testei com Webrick e fino
Solução
A solução foi que o Category.all
O método em cache os resultados no nível da classe; portanto, uma vez que foi buscado, tudo foi armazenado em cache para o restante das solicitações.
Não estava lá em desenvolvimento ambiente porque toda vez que o modelo era recarregado porque naquele ambiente o config.cache_classes
foi false
!
Outras dicas
Não sei se há um máximo nas linhas/parâmetros do cabeçalho, mas com muitas categorias o valor ETAG se torna muito longo, como mostra o seu exemplo.
Em vez de criar uma grande string contendo todas as datas de criação/modificação, você pode encontrar a data mais recente de modificação e usá -la para um ETAG.
Além disso o artigo que você citou usos fresh?
ao invés de stale?
incluindo alguns outros métodos. Por que você não está usando isso?
Editar: Ao olhar para o artigo em seu Link atualizado A solução parece ser, para preencher apenas um @category
(o mesmo que eles). Portanto achar a última categoria modificada
@category = Category.find(:first, :order => 'date DESC')
e use esse valor para gerar o MD5 para o ETAG.
Obtenha a lista completa de @categories
Somente se você estiver renderizando a página.