2012-05-24 57 views
9

随着ERB可以片缓存各个记录在列表视图中,如下所示:Rails的片段缓存呈现液体模板

<% @items.each do |item| %> 
    <% cache item do %> 
    <%= item.name %> 
    <% end %> 
<% end %> 

因此,观察到的列表中的第二时间,每个渲染项目将被从缓存中加载。使用Liquid模板时可以使用相同的方法吗?该模板看起来是这样的:

{% for item in items %} 
    {{ item.name }} 
{% endfor %} 

,并呈现:

template = Liquid::Template.parse(template) 
template.render('items' => @items) 

当遍历的项目,我想能够碎片缓存每一个。任何指针?

回答

8

可以在液体定义自定义标签,例如,如果你把这个在初始化

class Cacher < Liquid::Block 
    def initialize(tag_name, markup, tokens) 
    super 
    @key= markup.to_s 
    end 

    def render(context) 
    Rails.cache.fetch(@key) do 
     super 
    end 
    end 
end 

Liquid::Template.register_tag('cache', Cacher) 

然后,你可以做

{% cache "some_key" %} 
    ... 
{% endcache %} 

非常小心你如何构建缓存键。你当然希望避免冲突,但你也可能不希望人们能够从你的memcache存储中读取任意密钥(这是代码的作用)。匹配这个问题取决于谁可以在你的应用中访问这个。一种策略是命名空间缓存键。

+0

对于注意按键命名的注意事项+1。给予租户(在多租户应用程序中)编辑Liquid模板的能力时非常重要。 –

+0

真棒回答!很棒。非常感谢。 – Ivangrx

+0

非常好,谢谢 –