2011年1月13日木曜日

Rails3でキャッシュを解放する時にSweepを使ってオブザーバーパターン!!

Sweep!

キャッシュ解放の命令をコントローラに直接書きたくないんだ!

# app/top_controller.rb
caches_page :index

# app/posts_controller.rb
cache_sweeper :post_sweeper

# app/sweepers/post_sweeper.rb
class PostSweeper < ActionController::Caching::Sweeper
  observe Post

  def after_create(post)
    expire_public_page
  end

  def after_update(post)
    expire_public_page
  end

  def after_destroy(post)
    expire_public_page
  end

  private
  def expire_public_page
    expire_page :controller => 'top', :action => 'index'
  end
end

上記の用に、ActiveRecordを監視して、キャッシュをお掃除するという感じです。コントローラのcreate/update/destroyに埋め込むより、素早くどこでキャッシュを解放しているかが分かるのでいいですね。

キャッシュがpublic/index.htmlだったりする件について

キャッシュがうまく消えなかったあの頃、ビューファイルをいじっても反映されず、development.rbのキャッシュを無効にする設定をやっても反映されず... どうしたんだぁヘヘイベイベー!と清志郎の歌を歌いながらgit statusしてみたら、public/index.htmlが復活していた!

これはパフォーマンス上はいいと思うんだけど、認証が前提のグループウェアとかの場合って、静的ファイルになっちゃうと困る部分がありますよね。ここら辺はどうするんだろう。きっとうまいやり方があるんだろうな。そのうち必要になったら調べよう

追記: Railsのキャッシュの種類

調べました。Railsには、

  • ページキャッシュ
  • アクションキャッシュ
  • フラグメントキャッシュ
の3タイプのキャッシュがあって、今回のページキャッシュは静的ファイルを生成するものでした。残りの2つのキャッシュについては近い将来絶対に利用すると思うので、その時にまとめられたらいいなと思ってます。

0 件のコメント: