Rails cache_digests和conditionals

时间:2014-02-12 04:51:17

标签: ruby-on-rails-3 caching cache-digests

当我们使用缓存摘要缓存部分轨道时,部分中的条件逻辑如何处理?它是否缓存完整模板并稍后应用条件,以便可以将正确的json / html提供给正确的用户?

1 个答案:

答案 0 :(得分: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如何理解缓存应该对10月出生的人(基于条件语句)无效?

这里的答案是它根本不知道。它唯一知道的是users.haml取决于partial_onepartial_two,因此对这些内部部分中的任何一个的更改都会使 ALL {{1}无效页面缓存无论用户是什么'出生月份。