2006/09/23

TTでFragment Cache(1)

RoRには、テンプレートの一部をキャッシュに突っ込める機能がある。


Hello <%= @name %>
<% cache do %>
All the topics in the system:
<%= render_collection_of_partials "topic", Topic.find_all %>
<% end %>


みたいに書くと、cache do からendまでの間がキャッシュに入り2回目からはexpireするまでキャッシュのものを使う仕組み。

TTにも、Template::Plugin::Cacheみたいなものがあったけれど、これはキャッシュにしたい箇所を別のテンプレートファイルに分けなきゃらなくて、そのページでしか使われないその部分だけをキャッシュするにはちょっと荷が重すぎ。

なんでRailsで上のようなことが簡単にできるかというと、do~end間が遅延評価されるから。
Fragment Cacheの仕組みを実現するには、


そこで、TTで遅延評価されている箇所や構文がないか調べてみると、MACROが近いものそうということに気づけました。


[% MACRO partial BLOCK %]
Text [% variable %]
[% END %]

は、StashというTTの変数を扱うための構造へ変換され、partialとvariableは同列の変数情報として扱われる様子。

コンパイルされると、

$stash->set('partial', sub {
});

という構造へ展開されます。sub{} があるので、このpartial変数は呼び出されるまで実行されないことになります。つまり、MACROは遅延評価ができる構造になってる。

TTでFragment Cacheの仕組みを実現するには、MACRO化されたエリアを呼び出してキャッシュの管理を行うプラグインを書けばよさそうということに。

来週がんばって作れればいいけれど。。。

ラベル: ,


Comments: コメントを投稿



<< Home

This page is powered by Blogger. Isn't yours?