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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top