Probleme mit Russian Doll Caching mit Vorlagenvererbung

Ich habe sowohl Template Inheritance als auch Russian Doll Caching verwendet (mit demcache_digests gem) unabhängig voneinander in ausgewählten Teilen einer recht komplexen Rails-Anwendung mit viel Erfolg.

Ich habe Schwierigkeiten, die beiden Technologien auf vernünftige Weise zusammen zu nutzen, was mich vermuten lässt, dass ich möglicherweise etwas falsch mache ...

Stellen Sie sich als extrem einfaches Beispiel eine Anwendung vor, die aus zwei Controllern besteht, ThingOnes und ThingTwos. Diese Anwendung hat ein Layout (layouts/application.html.erb ), die einfach eine Header-Datei rendert mit:<%= render 'header' %>.

Standardmäßig sucht Rails in einer Reihe von Positionen nach diesem Teil, einschließlich des Ansichtsverzeichnisses für das Layout (views/application/_header.html.erb ) sowie alle für den aktuellen Controller spezifischen (wieviews/thing_ones/_header.html.erb oderviews/thing_twos/_header.html.erb ). Das bedeutet, dass ich zu Caching-Zwecken im Grunde genommen eine Vorlagenabhängigkeitsliste habe (die keine Engines oder etwas anderes zählt):

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

Nun schließen wir diesen Render-Aufruf wie folgt mit Caching ab:

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

Leider läuftrake cache_digests:nested_dependencies TEMPLATE=layouts/application ergibt die folgende Abhängigkeitsliste.

[
  "layouts/header"
]

Es scheint sich überhaupt nicht um die Vererbung von Vorlagen zu kümmern. Das Ändern der nicht in der Liste enthaltenen Dateien hat den erwarteten Effekt, dass nicht in der Liste enthaltene Dateien geändert werden - der Cache ist nicht ordnungsgemäß abgelaufen und der veraltete Header wird angezeigt.

Dies kann leicht behoben werden, indem die relevanten Vorlagenpfade wie folgt angegeben werden:

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

Dies scheint in der Tat eine sehr schlechte Lösung zu sein, da sie nicht gut wächst und viel frivole Dekoration zum Zwischenspeichern von Aufrufen erfordert, um das vorhandene Vorlagenvererbungsverhalten beizubehalten.

In ähnlicher Weise kann man die Position der Kopfzeile genauer angeben, wie folgt:

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

Dadurch wird auch das vorhandene Verhalten der Vorlagenvererbung nicht beibehalten, sodass es für unsere Anforderungen nicht geeignet ist.

Eine letzte Option liegt im Verschieben dercache Rufen Sie die Header-Partials selbst auf. Dies ist nicht nur ineffizient, da es dierender Aufruf aus dem Cache. Es ist auch mehr WET (schreibe alles zweimal) als DRY, was ein großer Nachteil ist.

Um zu meinen eigentlichen Fragen zu gelangen ... Mache ich das richtig? Dies scheint ein ziemlich großes Manko zu sein, das sich auf eine Vielzahl von Implementierungen auswirken würde, aber ich kann nicht wirklich viele Diskussionen zu diesem speziellen Thema finden. Deshalb frage ich mich, ob andere es auf eine Weise tun, die besser funktioniert. Gibt es eine bessere Möglichkeit, dies zu tun, oder zumindest automatisch die gesamte Template-Abhängigkeits-Hierarchie für Teilrender anzugeben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage