Problemas usando o cache de bonecas russas com herança de modelo

Eu tenho usado tanto a Herança de Modelos quanto o Cache de Bonecas Russas (usando ocache_digests gem) independentemente um do outro em partes selecionadas de uma aplicação Rails razoavelmente complexa, com muito sucesso.

Estou tendo dificuldade em usar as duas tecnologias juntas, de forma sã, o que me faz suspeitar que posso estar fazendo algo errado ...

Para um exemplo extremamente simples, considere um aplicativo que consiste em dois controladores, ThingOnes e ThingTwos. Esta aplicação tem um layout (layouts/application.html.erb ) que simplesmente renderiza um arquivo de cabeçalho com:<%= render 'header' %>.

Por padrão, o Rails irá procurar em um monte de locais para esta parcial, incluindo o diretório de visualização para o layout (views/application/_header.html.erb ), bem como qualquer específico para o controlador atual (comoviews/thing_ones/_header.html.erb ouviews/thing_twos/_header.html.erb ). Isso significa que, para fins de cache, eu basicamente tenho uma lista de dependências de modelo (sem contar os mecanismos, ou qualquer outra coisa) como esta:

[
  "application/header",
  "thing_ones/header",
  "thing_twos/header"
]

Agora, envolvemos essa chamada de renderização com o cache, da seguinte forma:

<% cache 'header' do %>
  <%= render 'header' %>
<% end %>

Infelizmente, correndorake cache_digests:nested_dependencies TEMPLATE=layouts/application resulta na seguinte lista de dependências.

[
  "layouts/header"
]

Não parece se importar com a herança de modelos. Modificar os arquivos não incluídos na lista tem o efeito esperado de modificar arquivos não incluídos na lista - o cache não está vencido corretamente e o cabeçalho antigo é exibido.

Isso pode ser facilmente remidido especificando os caminhos de modelo relevantes, da seguinte forma:

<% cache 'header' do %>
  <%# Template Dependency: application/header %>
  <%# Template Dependency: thing_ones/header %>
  <%# Template Dependency: thing_twos/header %>
  <%= render 'header' %>
<% end %>

Essa parece ser uma solução muito ruim, pois não cresce bem e requer muitas decorações frívolas para armazenar chamadas em cache, a fim de manter o comportamento de herança de modelo existente.

Da mesma forma, pode-se especificar mais explicitamente a localização do cabeçalho, assim:

<% cache 'header' do %>
  <%= render 'application/header' %>
<% end %>

Isso também falha em manter o comportamento de herança de modelo existente, tornando-o inadequado para as nossas necessidades.

Uma última opção está em mover ocache chamar os parciais do cabeçalho. Isso não é apenas ineficiente, pois deixa orender chamar fora do cache. Também é mais úmido (escreva tudo duas vezes) do que DRY, o que é um grande desvio.

Então, para chegar à minha (s) pergunta (s) real (ais) ... Estou fazendo isso corretamente? Essa parece ser uma grande falha que estaria afetando uma ampla variedade de implementações, mas não consigo encontrar muita discussão relacionada a essa questão específica, então me pergunto se outras pessoas estão fazendo isso de uma maneira que funcione melhor. Existe uma maneira melhor de fazer isso, ou pelo menos especificar automaticamente toda a hierarquia de dependências do modelo para renderizações parciais?

questionAnswers(1)

yourAnswerToTheQuestion