1. 程式人生 > >Ruby on Rails頁面快取

Ruby on Rails頁面快取

三種方式 Page Caching, Action Caching和 Fragment Caching
快取預設只在production 環境下啟動
Page Caching
caches_page :public_content
以URL為準
expire_page :action =>"public_content"
Action Caching
caches_action :premium_content
以URL為準
 expire_action :action => "premium_content", :id => article
 Page Caching 和 Action Caching的例項:
class ContentController < ApplicationController
 before_filter :verify_premium_user, :except => :public_content
 caches_page :public_content
 caches_action :premium_content
 cache_sweeper :article_sweeper,
        :only => [ :create_article,
        :update_article,
        :delete_article ]
 def public_content
  @articles = Article.list_public
 end
 def premium_content
  @articles = Article.list_premium
 end
 private
 def verify_premium_user
  return
   user = session[:user_id]
   user = User.find(user)
  if user
   unless user && user.active?
   redirect_to :controller =>  "login", :action => "signup_new"
  end
 end
end
刪除過期快取內容:
app/models中加article_sweeper.rb
class ArticleSweeper < ActionController::Caching::Sweeper
 observe Article
 def after_create(article)
  expire_public_page
 end
 def after_update(article)
  expire_article_page(article.id)
 end
 def after_destroy(article)
  expire_public_page
  expire_article_page(article.id)
 end
 private
 def expire_public_page
  expire_page(:controller => "content", :action => 'public_content')
 end
 def expire_article_page(article_id)
  expire_action(:controller =>  "content",
        :action => "premium_content",
        :id => article_id)
 end
end
app/public/content/show/1預設caches_page檔案路徑
app/public/content/show/1.html


Fragment Caching
controller:
class Blog1Controller < ApplicationController
 def list
  @dynamic_content = Time.now.to_s
  unless read_fragment(:action => 'list')
   logger.info("Creating fragment")
   @articles = Article.find_recent
  end
 end
end
#read_fragment()檢視一個action的fragment快取是否存在
view:
<%= @dynamic_content %>
<% cache do %>


 <% for article in @articles -%>


<%= h(article.body) %>


 <% end -%>


<% end %>
<%= @dynamic_content %>
使用多個快取段:
<% cache(:action => 'list', :part => 'articles') do %>


 <% for article in @articles -%>


<%= h(article.body) %>


 <% end -%>


<% end %>
<% cache(:action => 'list', :part => 'counts') do %>


There are a total of <%= @article_count %> articles.


<% end %>
#使用:part引數區分同一action下的不同快取段
快取過期
controller:
class Blog2Controller < ApplicationController
 def list
  @dynamic_content = Time.now.to_s
  @articles = Article.find_recent
  @article_count = @articles.size
 end
 def edit
  # 編輯文章時不更新統計快取
  expire_fragment(:action => 'list', :part => 'articles')
  redirect_to(:action => 'list')
 end
 def delete
  #刪除文章時同時刪除兩個快取
  expire_fragment(:action => 'list', :part => 'articles')
  expire_fragment(:action => 'list', :part => 'counts')
  redirect_to(:action => 'list')
 end
end
expire_fragment()可接正則表示式
expire_fragment(%r{/blog2/list. })
Fragment Caching儲存選項設定:
ActionController::Base.fragment_cache_store = <下面的選項之一>
ActionController::Caching::Fragments::FileStore.new(path)
ActionController::Caching::Fragments::DRbStore.new(url)
ActionController::Caching::Fragments::MemCachedStore.new(host)