No commit activity in last 3 years
No release in over 3 years
Merb plugin to cache html fragment
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

>= 0.1.0
 Project Readme
======
README
======

$Release: $


About
-----

merb_piece_cache is a Merb plug-in to cache html fragments.
You can eliminate database access with this plugin.

Currently only file-base cache store is provided.
(Memory-base cache store may be provided in future.)


Install
-------

    ### install gem
    $ sudo gem install merb_helpers_monkey
    ## add 'dependency "merb_piece_cache"'
    $ vi config/dependencies.rb

This plugin requires 'called_from' library.
If you install this plugin manually, don't forget to install 'called_from'.


Example
-------

* [controller] delay database access by if_not_cached() helper.
* [template] specify cache area by cache_with() helper.


controller:

    def index
      ## @user is necessary every time
      @user = User.current()
      ## @members is necessary only when cache is refreshed
      ## (block parameter is called only when cache is expired or not found)
      if_not_cached {|cache_key|
        @members = Members.all(:order=>[:created_at])
      }
      render
    end


template:

    <!-- rendered every time (because never cached) -->
    <% if @user %>
      Hello <%=h @user %>!
    <% else %>
      <a href="/login">Login</a>
    <% end %>

    <!-- rendered only when cache is expired or not found -->
    <% lifetime = 5*60  # sec, default is nil(=infinity) %>
    <% cache_with("members/index", lifetime) do %>
      <ul>
      <% for member in @members %>
        <li><%=h @member.name %></li>
      <% end %>
      <ul>
    <% end %>


Reference
---------

Merb_piece_cache plugin provides the following helpers.

* if_not_cached() {|cache_key| ... }
     Register block as callback object which is called when fragment
     cache is re-generated (In other words, block parameter is called
     only when cache is re-generated).
     Block paramter can receive cache_key as 1st argument so that
     you can switch data processing according to cache_key.
     
* piece_cache(cache_key, lifetime=nil) { ... }
     When cache is found and not expired, then add cache data into view.
     Otherwise, call block to re-generate cache data and cache it.
     (Notice that block parameter is called only when cache is re-generated.)
     It is able to specify cache lifetime. For example, if you specify
     lifetime=5*60, cache data will be expired after 5 minutes.

* cache_with(cache_key, lifetime=nil) { ... }
     Alias of piece_cache().
     You can re-define this helper to extend cache behaviour.


Configuration
-------------

You can configure merb_piece_cache plugin in your environment file.
(config/environments/{production,development,test}.rb).
For example, add the followings into your 'development.rb':

    Merb::Plugins.config[:merb_piece_cache] = {
      ## show cached area in template (convenient for debug!)
      :show_area => true,
      ## directory to place cache files (default: "MERB_ROOT/tmp/cache")
      :root_dir  => "/var/tmp",
    }


Tips
----

* You can prepare different data in if_not_exist() according to cache_key.

      def index
        if_not_cached {|cache_key|
	  case cache_key
	  when /^post\/(\d+)$/
	    @post = BlogPost.get($1)
          when /^post\/(\d+)/comments$/
	    @comments = BlogComment.all(:post_id=>$1)
	  end
	}
	render
      end

* piece_cache() (and also cache_with()) checks template timestamp.
  If cache data is older than template timestamp, then cache data will be
  re-generated.


Author
------

makoto kuwata <kwa(at)kuwata-lab.com>
copyright(c) 2009 kuwata-lab.com all rights reserved.


License
-------

MIT License