diff --git a/actionpack/lib/action_controller/test_case.rb b/actionpack/lib/action_controller/test_case.rb index a5d11193b9..4b4d792fa0 100644 --- a/actionpack/lib/action_controller/test_case.rb +++ b/actionpack/lib/action_controller/test_case.rb @@ -480,7 +480,8 @@ module ActionController @request.assign_parameters(@routes, controller_class_name, action.to_s, parameters) @request.session = ActionController::TestSession.new(session) if session - @request.flash.update(flash || {}) + @request.session["flash"] = @request.flash.update(flash || {}) + @request.session["flash"].sweep @controller.request = @request build_request_uri(action, parameters) diff --git a/actionpack/lib/action_dispatch/middleware/flash.rb b/actionpack/lib/action_dispatch/middleware/flash.rb index fef6b09a37..ff5fd6a1d7 100644 --- a/actionpack/lib/action_dispatch/middleware/flash.rb +++ b/actionpack/lib/action_dispatch/middleware/flash.rb @@ -78,32 +78,23 @@ module ActionDispatch include Enumerable def self.from_session_value(value) - flash = case value - when FlashHash # Before https://github.com/github/github-rails/pull/9 - value - when Hash # After, read plain Hash from the session - flashes = value['flashes'] || {} - flashes.stringify_keys! - discard = value['discard'] || [] - discard = discard.map do |item| - item.kind_of?(Symbol) ? item.to_s : item - end - new_from_values(flashes, Set.new(discard)) - else - new - end - flash.tap(&:sweep) + case value + when Hash # After github/github-rails#9, only plain Hashes are in the session + new(value['flashes'], value['discard']) + else + new + end end def to_session_value return nil if empty? - {'discard' => @used.to_a, 'flashes' => Hash[to_a]} + {'discard' => @used.to_a, 'flashes' => @flashes} end - def initialize #:nodoc: - @used = Set.new + def initialize(flashes = {}, discard = []) #:nodoc: + @used = Set.new(discard) @closed = false - @flashes = {} + @flashes = flashes @now = nil end @@ -253,15 +244,6 @@ module ActionDispatch Array(key || keys).each { |k| used ? @used << k : @used.delete(k) } return key ? self[key] : self end - - def self.new_from_values(flashes, used) - new.tap do |flash_hash| - flashes.each do |k, v| - flash_hash[k] = v - end - flash_hash.instance_variable_set("@used", used) - end - end end def initialize(app) @@ -269,6 +251,11 @@ module ActionDispatch end def call(env) + if (session = env['rack.session']) && (flash = Flash::FlashHash.from_session_value(session["flash"])) + flash.sweep + env[KEY] = flash + end + @app.call(env) ensure session = env['rack.session'] || {} @@ -285,7 +272,7 @@ module ActionDispatch env[KEY] = new_hash end - if session.key?('flash') && session['flash'].nil? + if session.key?('flash') && session['flash'].blank? session.delete('flash') end end diff --git a/actionpack/test/controller/flash_hash_test.rb b/actionpack/test/controller/flash_hash_test.rb index 8a62b3c147..047d881866 100644 --- a/actionpack/test/controller/flash_hash_test.rb +++ b/actionpack/test/controller/flash_hash_test.rb @@ -43,7 +43,6 @@ module ActionDispatch @hash['foo'] = 'bar' assert_equal({'foo' => 'bar'}, @hash.to_hash) - skip "For Rails 3 we are modifying the actual hash, not a dup of the @flashes ivar" @hash.to_hash['zomg'] = 'aaron' assert !@hash.key?('zomg') assert_equal({'foo' => 'bar'}, @hash.to_hash) @@ -67,6 +66,7 @@ module ActionDispatch decrypted_data = "{ \"session_id\":\"d98bdf6d129618fc2548c354c161cfb5\", \"flash\":{\"discard\":[], \"flashes\":{\"message\":\"hey you\"}} }" session = ActiveSupport::JSON.decode(decrypted_data) hash = Flash::FlashHash.from_session_value(session['flash']) + hash.sweep assert_equal({'discard' => %w[message], 'flashes' => { 'message' => 'hey you'}}, hash.to_session_value) assert_equal "hey you", hash[:message]