2008年4月28日月曜日

[Ruby on Rails] Railsのキャッシュ(フラグメント)

Railsのキャッシュは3種類(ページ、アクション、フラグメント)あって、認証ありのサイトなどで同一ページでもアクセスする条件によって画面が変わる場合はフラグメントを使うのが無難。

以下Rails2.0系でフラグメント・キャッシュを使うためのメモ

まずはキャッシュを使えるようにする

productionモードだとあらかじめキャッシュが使えるようになっているが、developementモードとtestモードの場合は使えないようになっている。
developementモードでキャッシュを使う場合は

config/environments/developement.rb
config.action_controller.perform_caching = false

これを書き換える。

config.action_controller.perform_caching = true


実際にキャッシュする

実際にフラグメント・キャッシュを行うには controller と view をいじる必要がある。

[view]
まずはviewのどの部分をキャッシュしたいのか決める。

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

<% cache do %> ~ <% end %> の間がキャッシュされる。
<% cache(:controller => "topics", :action => "list", :action_suffix => "all_topics") do %>
のように引数を渡すことで一意のキーを生成できる。
同じコントローラー、アクションでも id 別にキャッシュしたい場合は :aciton_suffix => @id などど指定することで id別のキャッシュファイルを作成することが可能。

[controller]
hoge_controller.rb
unless read_fragment :controller => "topics", :action => "list",  :action_suffix => "all_topics"
@topics = Topic.find(:all)
end

read_fragment というメソッドで、引数に渡されたキーを持つキャッシュがあるかどうか判断。
キャッシュされていない場合にのみデータベースにアクセス。

キャッシュの失効

プラグイン等を使わない限り、キャッシュが自動的に失効することはないので、モデル(テーブル)が更新された場合にキャッシュを失効する処理を書く必要がある。

コントローラーの create, update, destroy などのメソッド内で
expire_fragment :controller => "topics", :action => "list", :action_suffix => "all_topics"
場合によってはこの失効処理が複雑になることがある。
そういう場合、RailsにはSweeperという機能がある。

Railsでスイーパーを使ってみる

キャッシュファイルが生成される場所

キャッシュをファイルで保持する場合、www.example.com というドメインを持つサイト だったらtmp/cache/www.examle.com 以下に生成される。

参考:
Rails API ドキュメント Module ActionController::Caching::Fragments

0 件のコメント: