有选择地渲染液体模板?

时间:2013-11-23 05:37:55

标签: ruby liquid

是否有可能在液体模板中有选择地呈现特定标签,并将其余部分留给第二次渲染?

我的网页包含代码段(包含)和变量。片段存储在数据库中,并且呈现起来很昂贵。变量仅在运行时可用(通过登录页面方案中的URL请求)。我希望使用呈现的片段缓存页面内容,但所有剩余的液体标记都不会受到影响。

所以,如果我有

{% snippet header %}

{% if vars.first_name %}
Welcome, {{ vars.first_name }}
{% endif %}

{% snippet footer %}

我希望缓存的页面内容为:

The header content

{% if vars.first_name %}
Welcome, {{ vars.first_name }}
{% endif %}

The footer content

在运行时,这将从memcached存储中获取并呈现:

The header content

Welcome, John

The footer content

关于如何实现这一目标的任何想法?

更新:以下是我已经拥有的内容: (它有效,但我正在寻找一种更清洁,理想的液体解决方案。)

A" vars"使用给定名称生成变量的标记:

{% vars first_name %} #=> {{ vars.first_name }}

并且,我使用修改过的液体标记来表示我第一次不想渲染的所有内容:

{* if vars.first_name *}

因此,目前初始页面如下所示:

{% snippet header %}

{* if vars.first_name *}
Welcome, {% vars first_name %}
{* endif *}

{% snippet footer %}

一次呈现并缓存为:

The header content

{* if vars.first_name *}
Welcome, {{ vars.first_name }}
{* endif *}

The footer content

然后在运行时我检索缓存版本并将{*替换为{%等来获取

The header content

{% if vars.first_name %}
Welcome, {{ vars.first_name }}
{% endif %}

The footer content

我再次用液体渲染以达到预期的效果。

这可以完成工作,但不是纯粹的液体,我想知道是否有更清洁的解决方案。

有吗?

1 个答案:

答案 0 :(得分:1)

{% snippet header %}

{% raw %}{% if vars.first_name %}
Welcome, {{ vars.first_name }}
{% endif %}{% endraw %}

{% snippet footer %}

这应该是你想要缓存的渲染,然后如果你通过Liquid重新渲染它,我会认为它会处理运行时变量。