lib/fume/render_cache.rb in fume-0.10.0a vs lib/fume/render_cache.rb in fume-0.10.0

- old
+ new

@@ -1,16 +1,10 @@ module Fume module RenderCache - def self.init! - if defined? ::ActionController::Base - ::ActionController::Base.send :include, ControllerExtensions - end - - if defined? ::ActiveRecord::Base - ::ActiveRecord::Base.send :include, ActiveRecordExtensions - end + ::ActionController::Base.send :include, ControllerExtensions if defined? ::ActionController::Base + ::ActiveRecord::Base.send :include, ActiveRecordExtensions if defined? ::ActiveRecord::Base end module ActiveRecordExtensions extend ::ActiveSupport::Concern @@ -36,16 +30,16 @@ if params[:cache] params[:key] = build_render_cache_key(key) params[:options] = options - if fragment = params[:cache].read(params[:key]) + if page = RenderCachePage.load(params[:cache].read(params[:key])) params[:key] = nil - response.charset = fragment[:charset] - response.content_type = fragment[:content_type] - self.response_body = fragment[:body].html_safe + response.charset = page.charset + response.content_type = page.content_type + self.response_body = page.body.html_safe return end end yield if block_given? @@ -64,35 +58,47 @@ when Hash obj.keys.sort.map { |k| "#{k}=#{self.key_to_string(obj[k])}" }.join("&") when Array obj.map { |val| self.key_to_string(val) }.join(",") when Time, Date - obj.to_s(:db) + obj.utc.iso8601 else obj.to_s end end end class RenderCacheFilter - def filter(controller) + def around(controller) controller.render_cache_params ||= { options: {}, cache: nil } + controller.render_cache_params[:cache] = Rails.cache if controller.class.perform_caching yield params = controller.render_cache_params if params[:key] - content = { - :charset => controller.response.charset, - :content_type => controller.response.content_type, - :body => controller.response_body.is_a?(Array) ? controller.response_body.join : controller.response_body - } - params[:cache].write(params[:key], content, params[:options]) + page = RenderCachePage.new(controller.response.charset, + controller.response.content_type, + controller.response_body.is_a?(Array) ? controller.response_body.join : controller.response_body) + params[:cache].write(params[:key], page.dump, params[:options]) end + end + end + + class RenderCachePage < Struct.new(:charset, :content_type, :body) + def self.load(io) + page = YAML.load(io) if io + page if page.is_a?(self) + rescue Exception + nil + end + + def dump + YAML.dump(self) end end end end \ No newline at end of file