Module: Merb::GlobalHelpers

Defined in:
lib/merb_piece_cache/helpers.rb

Instance Method Summary collapse

Instance Method Details

#if_not_cached(&block) ⇒ Object



11
12
13
# File 'lib/merb_piece_cache/helpers.rb', line 11

def if_not_cached(&block)
  @_callback = block    # or @_deffered?
end

#piece_cache(cache_key, lifetime = nil) ⇒ Object Also known as: cache_with



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/merb_piece_cache/helpers.rb', line 15

def piece_cache(cache_key, lifetime=nil)
  #caller_str = caller(1)[0]    # caller() is too high cost to use in production mode
  #template_path = caller_str =~ /:\d+:in `/ && $`   #`
  template_path, linenum, funcname = called_from()
  ts = File.exist?(template_path) && File.mtime(template_path)
  cache_store = Merb::Plugins.config[:merb_piece_cache][:cache_store]
  piece = cache_store.read(cache_key, :timestamp=>ts, :content_type=>self.content_type)
  show_area = Merb::Plugins.config[:merb_piece_cache][:show_area]
  if piece
    Merb.logger.debug "[piece_cache] #{cache_key.inspect}: found."
    @_erb_buf << "<div style=\"font-weight:bold\">----- cached key=#{cache_key.inspect} -----</div>\n" if show_area
    @_erb_buf << piece
    @_erb_buf << "<div style=\"font-weight:bold\">----- /cached -----</div>\n" if show_area
  else
    Merb.logger.debug "[piece_cache] #{cache_key.inspect}: expired or not found."
    values = @_callback && @_callback.call(cache_key) || {}
    #values.each_pair {|k, v| self.instance_variable_set("@#{k}", v) } if values.is_a?(Hash)
    @_erb_buf << "<div style=\"font-weight:bold;color:red\">----- rendered key=#{cache_key.inspect} -----</div>\n" if show_area
    pos = @_erb_buf.length
    yield(values)
    piece = @_erb_buf[pos..-1]
    @_erb_buf << "<div style=\"font-weight:bold;color:red\">----- /rendered -----</div>\n" if show_area
    cache_store.write(cache_key, piece, :lifetime=>lifetime, :content_type=>self.content_type)
  end
  nil
end