From 3a102d052803f7f066e648454297301310d69906 Mon Sep 17 00:00:00 2001 From: Samuel Cochran Date: Thu, 29 Jan 2015 23:00:44 +1100 Subject: Fix flash remaining after last flash deleted Inside a controller functional test after the last flash is deleted it still persists the flash because to_session_value is nil. We should delete it from the session when the serialized version is nil, same as the flash middleware. --- actionpack/lib/action_controller/test_case.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'actionpack/lib') diff --git a/actionpack/lib/action_controller/test_case.rb b/actionpack/lib/action_controller/test_case.rb index d30615fade..10ad80d22c 100644 --- a/actionpack/lib/action_controller/test_case.rb +++ b/actionpack/lib/action_controller/test_case.rb @@ -643,6 +643,8 @@ module ActionController if flash_value = @request.flash.to_session_value @request.session['flash'] = flash_value + else + @request.session.delete('flash') end @response -- cgit v1.2.3 From f7adb34999eb4df7916102b60f5aa3f0ddc8210c Mon Sep 17 00:00:00 2001 From: Samuel Cochran Date: Thu, 29 Jan 2015 23:18:55 +1100 Subject: Discard from flash before persisting in session --- actionpack/lib/action_dispatch/middleware/flash.rb | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'actionpack/lib') diff --git a/actionpack/lib/action_dispatch/middleware/flash.rb b/actionpack/lib/action_dispatch/middleware/flash.rb index a7f95150a4..b1d402cd30 100644 --- a/actionpack/lib/action_dispatch/middleware/flash.rb +++ b/actionpack/lib/action_dispatch/middleware/flash.rb @@ -80,24 +80,24 @@ module ActionDispatch include Enumerable def self.from_session_value(value) #:nodoc: - flash = case value - when FlashHash # Rails 3.1, 3.2 - new(value.instance_variable_get(:@flashes), value.instance_variable_get(:@used)) - when Hash # Rails 4.0 - new(value['flashes'], value['discard']) - else - new - end - - flash.tap(&:sweep) - end - - # Builds a hash containing the discarded values and the hashes - # representing the flashes. - # If there are no values in @flashes, returns nil. + case value + when FlashHash # Rails 3.1, 3.2 + flashes = value.instance_variable_get(:@flashes) + new(flashes, flashes.keys) + when Hash # Rails 4.0 + flashes = value['flashes'] + new(flashes, flashes.keys) + else + new + end + end + + # Builds a hash containing the flashes to keep for the next request. + # If there are none to keep, returns nil. def to_session_value #:nodoc: - return nil if empty? - {'discard' => @discard.to_a, 'flashes' => @flashes} + flashes_to_keep = @flashes.except(*@discard) + return nil if flashes_to_keep.empty? + {'flashes' => flashes_to_keep} end def initialize(flashes = {}, discard = []) #:nodoc: -- cgit v1.2.3 From 3f528e371c9ac2cf8e240a29d500a18ab8f5439d Mon Sep 17 00:00:00 2001 From: Samuel Cochran Date: Fri, 30 Jan 2015 09:47:03 +1100 Subject: Migrate old flash behaviour --- actionpack/lib/action_dispatch/middleware/flash.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'actionpack/lib') diff --git a/actionpack/lib/action_dispatch/middleware/flash.rb b/actionpack/lib/action_dispatch/middleware/flash.rb index b1d402cd30..59639a010e 100644 --- a/actionpack/lib/action_dispatch/middleware/flash.rb +++ b/actionpack/lib/action_dispatch/middleware/flash.rb @@ -83,9 +83,15 @@ module ActionDispatch case value when FlashHash # Rails 3.1, 3.2 flashes = value.instance_variable_get(:@flashes) + if discard = value.instance_variable_get(:@used) + flashes.except!(*discard) + end new(flashes, flashes.keys) when Hash # Rails 4.0 flashes = value['flashes'] + if discard = value['discard'] + flashes.except!(*discard) + end new(flashes, flashes.keys) else new -- cgit v1.2.3