Displaying articles with tag cache

Ruby on Rails :: Fragment Caching

Posted by PunNeng, Sun Nov 09 22:19:00 UTC 2008

fragment caching เป็น post ต่อจาก page caching กับ action caching

ชื่อมันก็บอกอยู่แล้วว่าทำ cache แบบเป็นชิ้นๆ สิ่งที่นิยมทำ cache แบบนี้คือการ render เป็นส่วนๆ ในฝั่งของ html template ตัวอย่าง

  1
  2
  3
  4
  5
<b><%= @title %></b>
<% cache do %>
  a lot of text or ruby expression hear and it is 
  <%= render :partial => "topic", :locals => {:time => Time.now } %>
<% end %>

ในที่นี้ มันจะ cache ใน block ที่กำหนดไว้ โดยค่า default ในการอ้างถึงจะเป็นชื่อ action และ controller เช่น ถ้าจะ clear cache ก้อนนี้ จะเรียกใช้

expire_fragment(:controller => "topics", :action => "list")

ในความเป็นจริงแล้ว เราอาจจะมี cache หลายที่ในหนึ่งหน้า เลยมี options เพิ่มมา สำหรับกำหนดชื่อให้มันอีก

  1
cache(:action => "list", :action_suffix => "time")

ตัว action_suffix จะเป็นสิ่งที่ทำให้เราสามารถเข้าถึง cache ก้อนนี้ได้ เช่น

expire_fragment(:controller => "topics", :action => "list", :action_suffix => "time")

แล้วมันเอาไปเก็บไว้ที่ไหน??
จริงๆ ผมเขียนไปในตอนที่แล้วแล้ว ว่ามันเก็บไว้เป็น hash โดยใช้ ActiveSupport::Cache::MemoryStore เป็นตัวบันทึก

รายละเอียดเพิ่มเติมดูได้ใน API ได้เลย

1 comment | Filed Under: Ruby on Rails | Tags: cache

Ruby on Rails :: Action Caching

Posted by PunNeng, Sun Oct 26 21:09:00 UTC 2008

ต่อจากคราวที่แล้ว

ใน API ของ rails เอง เขียนอธิบายไว้ว่า มันไม่ได้ต่างอะไรกับ page caching มาก แต่ผมว่ามันค่อนข้างต่างเลยแหละ ถ้าจะพิจารณาการบันทึกข้อความสำหรับ cache

เรื่อง configuration ก็เหมือนกับ page caching ครับ จะข้ามไป

แล้ว Action Caching ใช้ตอนไหน ??
ก็ใช้ตอนที่เราต้องใช้ filter เช่น before_filter หรือ after_filter
ตัวอย่างที่เขาใช้อธิบายใน API คือ เรือ่ง authentication ใน code หน้าตาจะประมาณนี้

  1
  2
  3
  4
  5
class ListsController < ApplicationController
    before_filter :authenticate, :except => :public
    caches_page   :public
    caches_action :index, :show, :feed
end

จากตัวอย่างข้างบน จะมีการ authentication ที่ action index, show และ feed ถ้าหากไม่ใช้ caches_action แต่ไปใช้ caches_page แทน มันจะเขียน file.html แล้วมันจะไม่วิ่งเข้า before_filter :authetication
ทางแก้ก็คือ ใช้ caches_action แทน

โดยการเก็บ cache มันจะไปใช้ความสามารถของ Fragment Cache แทน สำหรับ Fragment Cache ไว้ตอนหน้าครับ ซึ่งมันจะเก็บ cache ไว้ที่ Hash ไว้ใน ActiveSupport::Cache::MemoryStore ครับ ถ้าเรา restart server มันก็จะหายไป ไม่ได้เก็บถาวรเหมือน Page Caching

ในการ clear action caching ก็ไม่ได้ซับซ้อนอะไร เพียงแค่

  1
expire_action :controller =>"lists", :action => "index"

นอกจากนี้ยังใส่เงื่อนไขได้ด้วย เช่น

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
class ListsController < ApplicationController
    before_filter :authenticate, :except => :public
    caches_page   :public
    caches_action :index, :if => Proc.new { |c| !c.request.format.json? } # cache if is not a JSON request
    caches_action :show, :cache_path => { :project =&gt; 1 }
    caches_action :feed, :cache_path => Proc.new { |controller|
      controller.params[:user_id] ?
        controller.send(:user_list_url, c.params[:user_id], c.params[:id]) :
        controller.send(:list_url, c.params[:id]) }
end

ข้อมูลเพิ่มเติมดูได้ที่ API เลยครับ

0 comments | Filed Under: Ruby on Rails | Tags: cache

codegent: we're hiring