update FlashHash for 3.2

This commit is contained in:
Greg Ose
2014-09-24 12:39:03 -05:00
parent 283923f530
commit e1c7a232ca
3 changed files with 19 additions and 31 deletions

View File

@@ -480,7 +480,8 @@ module ActionController
@request.assign_parameters(@routes, controller_class_name, action.to_s, parameters) @request.assign_parameters(@routes, controller_class_name, action.to_s, parameters)
@request.session = ActionController::TestSession.new(session) if session @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 @controller.request = @request
build_request_uri(action, parameters) build_request_uri(action, parameters)

View File

@@ -78,32 +78,23 @@ module ActionDispatch
include Enumerable include Enumerable
def self.from_session_value(value) def self.from_session_value(value)
flash = case value case value
when FlashHash # Before https://github.com/github/github-rails/pull/9 when Hash # After github/github-rails#9, only plain Hashes are in the session
value new(value['flashes'], value['discard'])
when Hash # After, read plain Hash from the session else
flashes = value['flashes'] || {} new
flashes.stringify_keys! end
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)
end end
def to_session_value def to_session_value
return nil if empty? return nil if empty?
{'discard' => @used.to_a, 'flashes' => Hash[to_a]} {'discard' => @used.to_a, 'flashes' => @flashes}
end end
def initialize #:nodoc: def initialize(flashes = {}, discard = []) #:nodoc:
@used = Set.new @used = Set.new(discard)
@closed = false @closed = false
@flashes = {} @flashes = flashes
@now = nil @now = nil
end end
@@ -253,15 +244,6 @@ module ActionDispatch
Array(key || keys).each { |k| used ? @used << k : @used.delete(k) } Array(key || keys).each { |k| used ? @used << k : @used.delete(k) }
return key ? self[key] : self return key ? self[key] : self
end 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 end
def initialize(app) def initialize(app)
@@ -269,6 +251,11 @@ module ActionDispatch
end end
def call(env) 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) @app.call(env)
ensure ensure
session = env['rack.session'] || {} session = env['rack.session'] || {}
@@ -285,7 +272,7 @@ module ActionDispatch
env[KEY] = new_hash env[KEY] = new_hash
end end
if session.key?('flash') && session['flash'].nil? if session.key?('flash') && session['flash'].blank?
session.delete('flash') session.delete('flash')
end end
end end

View File

@@ -43,7 +43,6 @@ module ActionDispatch
@hash['foo'] = 'bar' @hash['foo'] = 'bar'
assert_equal({'foo' => 'bar'}, @hash.to_hash) 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' @hash.to_hash['zomg'] = 'aaron'
assert !@hash.key?('zomg') assert !@hash.key?('zomg')
assert_equal({'foo' => 'bar'}, @hash.to_hash) assert_equal({'foo' => 'bar'}, @hash.to_hash)
@@ -67,6 +66,7 @@ module ActionDispatch
decrypted_data = "{ \"session_id\":\"d98bdf6d129618fc2548c354c161cfb5\", \"flash\":{\"discard\":[], \"flashes\":{\"message\":\"hey you\"}} }" decrypted_data = "{ \"session_id\":\"d98bdf6d129618fc2548c354c161cfb5\", \"flash\":{\"discard\":[], \"flashes\":{\"message\":\"hey you\"}} }"
session = ActiveSupport::JSON.decode(decrypted_data) session = ActiveSupport::JSON.decode(decrypted_data)
hash = Flash::FlashHash.from_session_value(session['flash']) 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({'discard' => %w[message], 'flashes' => { 'message' => 'hey you'}}, hash.to_session_value)
assert_equal "hey you", hash[:message] assert_equal "hey you", hash[:message]