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で指定。指定できるオプションは以下のとおり。

Adding New Templating Systems

Railsには2つのテンプレートシステムがあるんだけど、簡単に自分でテンプレートシステムを作ることができるよ。

まずは次の2つの条件を満たすテンプレートハンドラクラスを作る。

  • コンストラクタはビューオブジェクトをパラメタとしてとること
  • render()というメソッドを実装する。このメソッドはテンプレートのテキストとローカル変数のハッシュをパラメタとして受けとり、レンダリングしたテキストを返すようにする。

で、そのハンドラを環境設定ファイルかapplication.rbで登録すればOK。

ActionView::Base.register_template_handler("rdoc", RDocTemplate)


コントローラのインスタンス変数やローカル変数をテンプレートで使えるようにするためにはrubyバインディングを使ってね。ってバインディングよくわからん…orz。


Chapter17終了!!