Problemas al utilizar el caché de muñecas rusas con herencia de plantillas

He estado usando tanto la herencia de plantillas como el caché de muñecas rusas (usando elcache_digests joya) independientemente entre sí en partes seleccionadas de una aplicación Rails bastante compleja, con mucho éxito.

Estoy teniendo dificultades para usar las dos tecnologías juntas, de una manera sana, lo que me hace sospechar que puedo estar haciendo algo mal ...

Para un ejemplo extremadamente simple, considere una aplicación que consta de dos controladores, ThingOnes y ThingTwos. Esta aplicación tiene un diseño (layouts/application.html.erb ) que simplemente presenta un archivo de encabezado con:<%= render 'header' %>.

De forma predeterminada, Rails buscará en un montón de ubicaciones para este parcial, incluido el directorio de vista para el diseño (views/application/_header.html.erb ) así como cualquier específico del controlador actual (comoviews/thing_ones/_header.html.erb oviews/thing_twos/_header.html.erb ). Esto significa que, para fines de almacenamiento en caché, básicamente tengo una lista de dependencias de plantilla (sin contar los motores, o cualquier otra cosa) como esta:

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

Ahora, envolvemos esa llamada de render con el almacenamiento en caché, así:

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

Desafortunadamente, corriendorake cache_digests:nested_dependencies TEMPLATE=layouts/application resulta en la siguiente lista de dependencias.

[
  "layouts/header"
]

No parece importarle en absoluto la herencia de plantillas. La modificación de los archivos no incluidos en la lista tiene el efecto esperado de modificar los archivos no incluidos en la lista: la memoria caché no caduca correctamente y se muestra el encabezado obsoleto.

Esto se puede remediar fácilmente especificando las rutas de plantilla relevantes, de esta manera:

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

Esto parece una solución muy pobre, ya que no crece bien y requiere una gran cantidad de decoraciones frívolas para almacenar en caché las llamadas con el fin de conservar el comportamiento de herencia de la plantilla existente.

De manera similar, uno puede especificar más explícitamente la ubicación del encabezado, así:

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

Esto tampoco logra mantener el comportamiento de herencia de la plantilla existente, por lo que no es adecuado para nuestras necesidades.

Una última opción es mover elcache llamar a los parciales de cabecera ellos mismos. Esto no solo es ineficiente, ya que deja elrender llamar fuera de la memoria caché. También es más WET (escribe todo dos veces) que DRY, lo cual es un gran cambio.

Entonces, para llegar a mi (s) pregunta (s) real ... ¿Estoy haciendo esto correctamente? Esto parece ser una deficiencia bastante importante que estaría afectando una gran variedad de implementaciones, pero realmente no puedo encontrar mucha discusión relacionada con este tema específico, así que me pregunto si otros lo están haciendo de una manera que funcione mejor. ¿Hay una mejor manera de hacerlo, o al menos especificar automáticamente toda la jerarquía de dependencia de la plantilla para los rendimientos parciales?

Respuestas a la pregunta(1)

Su respuesta a la pregunta