9

ERB を使用すると、次のようにリスト ビューで個々のレコードをフラグメント化してキャッシュできます。

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

したがって、リストが 2 回目に表示されると、レンダリングされた各項目がキャッシュから読み込まれます。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 ストアから任意のキーを読み取れるようにしたくないでしょう (このコードはそうしています)。これがどのように一致するかは、アプリで誰がこれにアクセスできるかによって異なります。戦略の 1 つは、ネームスペース キャッシュ キーを使用することです。

于 2012-05-28T07:48:34.990 に答える