9

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

<% @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)

当它遍历项目时,我希望能够对每个项目进行分段缓存。任何指针?

4

1 回答 1

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 存储中读取任意键(这段代码就是这样做的)。这有多重要取决于谁可以在您的应用程序中访问它。一种策略是命名空间缓存键。

于 2012-05-28T07:48:34.990 回答