From 72cb6f58be6590ac2590eea420a1b3ef175189b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Johan=20S=C3=B6rensen?= <johan@johansorensen.com>
Date: Thu, 28 May 2009 09:30:49 -0500
Subject: The FlashHash and friends causes a lot of needless session storing,
 when we know for a fact that there's no content in the flash. By not storing
 the empty hash in the session we save a lot of communication with the various
 session backends, while still keeping the same interface to the flash. [#2703
 state:resolved]

Signed-off-by: Joshua Peek <josh@joshpeek.com>
---
 .../lib/action_controller/base/chained/flash.rb    | 70 ++++++++++++----------
 1 file changed, 37 insertions(+), 33 deletions(-)

(limited to 'actionpack/lib')

diff --git a/actionpack/lib/action_controller/base/chained/flash.rb b/actionpack/lib/action_controller/base/chained/flash.rb
index 7a8dd2dcf9..2d084ba1ab 100644
--- a/actionpack/lib/action_controller/base/chained/flash.rb
+++ b/actionpack/lib/action_controller/base/chained/flash.rb
@@ -30,7 +30,7 @@ module ActionController #:nodoc:
 
     # TODO : Remove the defined? check when new base is the main base
     depends_on Session if defined?(ActionController::Http)
-    
+
     included do
       # TODO : Remove the defined? check when new base is the main base
       if defined?(ActionController::Http)
@@ -129,6 +129,11 @@ module ActionController #:nodoc:
         (@used.keys - keys).each{ |k| @used.delete(k) }
       end
 
+      def store(session, key = "flash")
+        return if self.empty?
+        session[key] = self
+      end
+
       private
         # Used internally by the <tt>keep</tt> and <tt>discard</tt> methods
         #     use()               # marks the entire flash as used
@@ -145,48 +150,47 @@ module ActionController #:nodoc:
 
     module InstanceMethodsForBase #:nodoc:
       protected
+        def perform_action_with_flash
+          perform_action_without_flash
+          if defined? @_flash
+            @_flash.store(session)
+            remove_instance_variable(:@_flash)
+          end
+        end
 
-      def perform_action_with_flash
-        perform_action_without_flash
-        remove_instance_variable(:@_flash) if defined?(@_flash)
-      end
-
-      def reset_session_with_flash
-        reset_session_without_flash
-        remove_instance_variable(:@_flash) if defined?(@_flash)
-      end
+        def reset_session_with_flash
+          reset_session_without_flash
+          remove_instance_variable(:@_flash) if defined?(@_flash)
+        end
     end
 
     module InstanceMethodsForNewBase #:nodoc:
       protected
+        def process_action(method_name)
+          super
+          if defined? @_flash
+            @_flash.store(session)
+            remove_instance_variable(:@_flash)
+          end
+        end
 
-      def reset_session
-        super
-        remove_flash_instance_variable
-      end
-
-      def process_action(method_name)
-        super
-        remove_flash_instance_variable
-      end
-      
-      def remove_flash_instance_variable
-        remove_instance_variable(:@_flash) if defined?(@_flash)
-      end
+        def reset_session
+          super
+          remove_instance_variable(:@_flash) if defined?(@_flash)
+        end
     end
 
     protected
+      # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
+      # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
+      # to put a new one.
+      def flash #:doc:
+        if !defined?(@_flash)
+          @_flash = session["flash"] || FlashHash.new
+          @_flash.sweep
+        end
 
-    # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
-    # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
-    # to put a new one.
-    def flash #:doc:
-      unless defined?(@_flash)
-        @_flash = session["flash"] ||= FlashHash.new
-        @_flash.sweep
+        @_flash
       end
-
-      @_flash
-    end
   end
 end
-- 
cgit v1.2.3