AWDwR "Chapter17 Action View" つづきのつづきのつづきのつづき
いよいよChapter17大詰め。
Caching, Part Two
Chapter16でキャッシュの話があったけど、Railsにはさらにページの一部分をキャッシュする機能があって、ビューのテンプレートの一部をcache()のブロックで囲んでおくとその部分だけキャッシュしてくれる。
<%= @dynamic_content %> # ここは毎回変わる <% cache do %> ... # ここはキャッシュされる <% end %> <%= @dynamic_content %> # ここは毎回変わる
ただしキャッシュはプロダクションモードの時のみ有効。WEBrickの場合は-e productionオプションをつけるとプロダクションモードになる。
ビューでいくらキャッシュを使ってもアクションの中でその部分を表示するためのロジックが実行されてしまうと意味なしなので、そういう時は以下のようread_fragment()を使ってフラグメントがないときだけロジックを実行するようにする。
class BlogController < ApplicationController def list unless read_fragment(:action => 'list') @article = Article.find_recent end end end
キャッシュのフラグメントをエクスパイアするにはこうする。
expire_fragment(:controller => 'blog', :action => 'list')
また一つのページ内で二つ以上のキャッシュのフラグメントを使用したい場合はこうしておいて…
<% cache(:action => 'list', :part => 'articles') do %> ... <% end %> <% cache(:action => 'list', :part => 'counts') do %> ... <% end %>
エクスパイアするフラグメントをpartオプションで指定する。
class BlogController < ApplicationController def edit expire_fragment(:action => 'list', :part => 'articles') ... end def delete expire_fragment(:action => 'list', :part => 'articles') expire_fragment(:action => 'list', :part => 'counts') ... end end
キャッシュの保存方法はActionController::Base.fragment_cache_storeで指定。指定できるオプションは以下のとおり。
- ActionController::Caching::Fragments::MemoryStore.new ページフラグメントをメモリ内に格納。
- ActionController::Caching::Fragments::FileStore.new(path) pathで指定したディレクトリに格納。
- ActionController::Caching::Fragments::DRbStore.new(url) DRbサーバに格納。
- ActionController::Caching::Fragmnets::MemCachedStore.new(host) memcachedサーバに格納。
Adding New Templating Systems
Railsには2つのテンプレートシステムがあるんだけど、簡単に自分でテンプレートシステムを作ることができるよ。
まずは次の2つの条件を満たすテンプレートハンドラクラスを作る。
- コンストラクタはビューオブジェクトをパラメタとしてとること
- render()というメソッドを実装する。このメソッドはテンプレートのテキストとローカル変数のハッシュをパラメタとして受けとり、レンダリングしたテキストを返すようにする。
で、そのハンドラを環境設定ファイルかapplication.rbで登録すればOK。
ActionView::Base.register_template_handler("rdoc", RDocTemplate)
コントローラのインスタンス変数やローカル変数をテンプレートで使えるようにするためにはrubyのバインディングを使ってね。ってバインディングよくわからん…orz。
Chapter17終了!!