【发布时间】:2014-02-12 04:51:16
【问题描述】:
当我们使用缓存摘要在 Rails 中缓存部分时,部分中的条件逻辑是如何处理的?它是否会缓存完整的模板,然后再应用条件,以便将正确的 json/html 提供给正确的用户?
【问题讨论】:
标签: ruby-on-rails-3 caching cache-digests
当我们使用缓存摘要在 Rails 中缓存部分时,部分中的条件逻辑是如何处理的?它是否会缓存完整的模板,然后再应用条件,以便将正确的 json/html 提供给正确的用户?
【问题讨论】:
标签: ruby-on-rails-3 caching cache-digests
它会缓存完整的模板,然后再应用条件,所以 正确的 json/html 可以提供给正确的用户吗?
这部分问题对我来说似乎有点不清楚,所以我会根据“条件”可能是什么来提供不同的选项。
首先,缓存摘要不关心基于@variables 状态的内部条件(除非在其缓存键中提及特定状态)。考虑以下示例:
# users.haml
.welcome_block
- if @user.admin?
%h4 Hello, admin!
- else
%h4 Hello, user!
如果您使用cache ['users_haml'] 将缓存应用于整个页面,则缓存将只生成一次(对于具有任何角色的第一个用户)。稍后访问此页面的任何用户都会看到与显示给第一个用户的相同的h4 问候语。这里的原因是digest for string 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怎么理解对10月出生的人来说缓存应该失效(基于条件语句)?
这里的答案是它根本不知道。它唯一知道的是users.haml 依赖于partial_one 和partial_two,因此更改这些内部部分中的任何一个都会使users.haml 页面缓存无效ALL 无论用户的月份如何出生。
【讨论】: