Как обновить кеширование фрагмента при обновлении регистра? - PullRequest
0 голосов
/ 08 февраля 2019

Я только недавно обновил свой проект с Rails 4 до Rails 5.2.Проходя тесты, я заметил, что кэши не обновляются там, где они должны.

Просматривая документацию, я заметил некоторые различия в том, как ActionView выполняет кеширование.

В Rails 4 естьupdated_at значение в имени кеша.При этом при каждом касании элемента предыдущий кеш устаревает и создается новый кеш.

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
      ^class   ^id ^updated_at    ^template tree digest

Отлично.Но в Rails 5.2 появились некоторые изменения, когда значение updated_at больше не указывается в имени кэша.Из документации:

views/template/action.html.erb:7a1156131a6928cb0026877f8b749ac9/projects/123
      ^template path           ^template tree digest            ^class   ^id

Тем не менее, в документации говорится:

При касании проекта updated_at изменяется cache_version, даже если ключ остается стабильным.Это означает, что в отличие от традиционного подхода с истечением срока действия кэша на основе ключей, вы не будете создавать мусор кеша, неиспользуемые ключи, просто потому, что обновлена ​​зависимая запись.

Исходя из этого, я полагаю, что это делаетнекоторые под капот магии, чтобы заменить значение из кэша, но это не так.

Мой код:

<% cache ['tags', post] do %>
  <%= render "shared/tags", post: post %>
<% end %>

Даже когда я post.touch на моей консоли, кэш все ещеостается старый, и я должен удалить кэш вручную, чтобы он работал.Я что-то пропустил?Как мне заставить его работать снова?

Я знаю, что могу сделать что-то вроде

cache "tags/#{post.updated_at}" do
...

, но из документации это не так.

1 Ответ

0 голосов
/ 11 февраля 2019

Я понял это.Мой проект использует redis для хранения кэша, и я не удалил gem redis-rails из моего Gemfile после обновления.Метод, который записывает кэш из redis-activesupport gem, перезаписывал встроенный метод rails для redis, который был внедрен с Rails 5.2.

Поэтому исправление было просто стереть redis-rails gem.

...