Rails片段缓存呈现液体模板

imd*_*rek 9 memcached ruby-on-rails liquid

使用ERB,您可以在列表视图中对缓存单个记录进行分段,如下所示:

<% @items.each do |item| %>
  <% cache item do %>
    <%= item.name %>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

因此,第二次查看列表时,将从缓存加载每个呈现的项目.使用Liquid模板时是否可以使用相同的方法?模板可能类似于:

{% for item in items %}
  {{ item.name }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

并呈现:

template = Liquid::Template.parse(template)
template.render('items' => @items)
Run Code Online (Sandbox Code Playgroud)

当它循环遍历项目时,我希望能够对每个项目进行分段缓存.有什么指针吗?

Fre*_*ung 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)
Run Code Online (Sandbox Code Playgroud)

那你可以做

{% cache "some_key" %}
  ...
{% endcache %}
Run Code Online (Sandbox Code Playgroud)

构建缓存键的方式要非常小心.你当然希望避免冲突,但你也可能不希望人们能够从你的memcache商店中读取任意密钥(这段代码就是这样).如何匹配这一点取决于谁可以在您的应用中访问此功能.一种策略是命名空间缓存键.