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
кэши страниц независимо от месяца рождения пользователя.