Problemy z wykorzystaniem rosyjskiego buforowania lalek z dziedziczeniem szablonów

Używałem zarówno dziedziczenia szablonów, jak i rosyjskiego buforowania lalek (używającklejnot cache_digests) niezależnie od siebie w wybranych częściach dość złożonej aplikacji Rails, z dużym powodzeniem.

Mam problem z korzystaniem z tych dwóch technologii razem, w rozsądny sposób, co sprawia, że ​​podejrzewam, że mogę robić coś złego ...

Dla niezwykle prostego przykładu rozważ aplikację składającą się z dwóch kontrolerów, ThingOnes i ThingTwos. Ta aplikacja ma jeden układ (layouts/application.html.erb ), który po prostu renderuje plik nagłówkowy za pomocą:<%= render 'header' %>.

Domyślnie Railsy będą szukać w tym miejscu kilku części, w tym katalogu widoku układu (views/application/_header.html.erb ) jak również wszelkie specyficzne dla bieżącego kontrolera (jakviews/thing_ones/_header.html.erb lubviews/thing_twos/_header.html.erb ). Oznacza to, że dla celów buforowania zasadniczo mam listę zależności szablonów (nie licząc silników lub cokolwiek innego) w ten sposób:

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

Teraz zawijamy, że renderowanie wywołania jest buforowane, tak:

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

Niestety, działarake cache_digests:nested_dependencies TEMPLATE=layouts/application powoduje wyświetlenie następującej listy zależności.

[
  "layouts/header"
]

Wydaje się, że w ogóle nie przejmuje się dziedziczeniem szablonów. Modyfikacja plików nie znajdujących się na liście ma oczekiwany efekt modyfikacji plików nie znajdujących się na liście - pamięć podręczna nie wygasła prawidłowo i wyświetlany jest nieaktualny nagłówek.

Można to łatwo usunąć, określając odpowiednie ścieżki szablonów, w ten sposób:

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

Wydaje się, że jest to bardzo kiepskie rozwiązanie, ponieważ nie rozwija się dobrze i wymaga wiele frywolnych dekoracji do buforowania połączeń w celu zachowania istniejącego zachowania dziedziczenia szablonu.

Podobnie, można wyraźniej określić lokalizację nagłówka, w ten sposób:

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

To również nie zachowuje istniejącego zachowania dziedziczenia szablonu, czyniąc go nieodpowiednim dla naszych potrzeb.

Ostatnia opcja polega na przesunięciucache sami wołają częściowe nagłówki. To nie tylko nieefektywne, ponieważ pozostawiarender zadzwonić z pamięci podręcznej. Jest to również więcej WET (zapisz wszystko dwa razy) niż DRY, co jest dużym wyłączeniem.

Więc, aby przejść do mojego aktualnego pytania ... Czy robię to poprawnie? Wydaje się, że jest to dość poważna wada, która wpływa na wiele różnych implementacji, ale nie mogę znaleźć wielu dyskusji związanych z tym konkretnym problemem, więc zastanawiam się, czy inni robią to w sposób, który działa lepiej. Czy jest lepszy sposób, aby to zrobić, lub przynajmniej automatycznie określić całą hierarchię zależności szablonów dla renderów częściowych?

questionAnswers(1)

yourAnswerToTheQuestion