2012-05-24 11 views
9

をレンダリングそうのようなリストビューでキャッシュ個々のレコードを断片化することができますRailsのフラグメントキャッシュ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) 

それはアイテムをループするとき、私はキャッシュにそれぞれ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つの戦略は、キャッシュキーのネームスペースです。

+0

+1キーの命名に注意してください。テナントに(マルチテナントアプリケーションで)液体テンプレートを編集する能力を与える際に非常に重要です。 –

+0

恐ろしい答えです!よく働く。どうもありがとう。 – Ivangrx

+0

非常に良い、ありがとう –

関連する問題