Rails cache_digests и условные выражения

Когда мы кешируем партиал в рельсах, используя дайджесты кеша, как обрабатывается условная логика в партиале? Кеширует ли он полный шаблон, а затем применяет условные выражения, чтобы правильный json/html мог быть предоставлен нужному пользователю?

1 ответ

Решение

Кеширует ли он полный шаблон, а затем применяет условные выражения, чтобы правильный json / html мог быть предоставлен нужному пользователю?

Эта часть вопроса мне кажется немного неясной, поэтому я предоставлю различные варианты, основанные на том, какие могут быть "условные выражения".

Прежде всего, дайджесты кеша не заботятся о внутренних условиях, основанных на состоянии @ переменных (если только не указано конкретное состояние внутри его ключа кеша). Рассмотрим следующий пример:

# users.haml
.welcome_block
  - if @user.admin?
    %h4 Hello, admin!
  - else
    %h4 Hello, user!

Если вы применяете кеширование ко всей странице с cache ['users_haml'], кэш будет сгенерирован только один раз (для первого пользователя с любой ролью). Любой пользователь, который зашел на эту страницу позже, увидит то же самое h4 приветствие как то, которое было показано первому пользователю. Причина в том, что digest для строки users_hamlдоказано cache метод, всегда один и тот же, независимо от каких-либо обстоятельств.

С другой стороны, cache @user обеспечит немного другое поведение. Каждый пользователь, который открывает users.haml страница увидит правильное приветствие в зависимости от его / ее роли. Причиной такого поведения является то, что digest отличается для всех объектов типа User, так cache_digests генерирует N кэшированных страниц для N пользователей.

Последний вид условных выражений, который приходит на ум, основывается на рендеринге условных частичек, например:

# users.haml
- cache [@user.month_of_birth]
  - if @user.month_of_birth == 'October'
    = render 'partial_one'
  - else
    = render 'partial_two'

Таким образом, эта страница отображает правильную кэшированную страницу для пользователей с разными месяцами рождения. Но что должно произойти, если я изменю содержимое partial_one? Как cache_digests Понимаете, что кеш должен быть признан недействительным для тех, кто родился в октябре (на основании условного высказывания)?

Ответ здесь заключается в том, что он вообще этого не знает. Единственное, что он знает, это то, что users.haml зависит от обоих partial_one а также partial_two, так что изменения в любом из этих внутренних частичек аннулируют ВСЕ users.haml кэши страниц независимо от месяца рождения пользователя.

Другие вопросы по тегам