aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/core_ext/hash/indifferent_access.rb8
-rw-r--r--activesupport/test/core_ext/hash_ext_test.rb26
3 files changed, 26 insertions, 10 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 8e6f05884d..14876558c6 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fixed an exception when using Ajax based requests from Safari because Safari appends a \000 to the post body. Symbols can't have \000 in them so indifferent access would throw an exception in the constructor. Indifferent hashes now use strings internally instead. #746 [Tobias Luetke]
+
* Added String#to_time and String#to_date for wrapping ParseDate
diff --git a/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb b/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
index 2353cfaf3b..d8594db739 100644
--- a/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
+++ b/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb
@@ -1,8 +1,8 @@
class HashWithIndifferentAccess < Hash
- def initialize(constructor)
+ def initialize(constructor = {})
if constructor.is_a?(Hash)
super()
- update(constructor.symbolize_keys)
+ update(constructor.stringify_keys)
else
super(constructor)
end
@@ -12,7 +12,7 @@ class HashWithIndifferentAccess < Hash
def [](key)
case key
- when Symbol: regular_reader(key) || regular_reader(key.to_s)
+ when Symbol: regular_reader(key.to_s) || regular_reader(key)
when String: regular_reader(key) || regular_reader(key.to_sym)
else regular_reader(key)
end
@@ -21,7 +21,7 @@ class HashWithIndifferentAccess < Hash
alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
def []=(key, value)
- regular_writer(key.is_a?(String) ? key.to_sym : key, value)
+ regular_writer(key.is_a?(Symbol) ? key.to_s : key, value)
end
end
diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb
index f5ace81927..d74a32e892 100644
--- a/activesupport/test/core_ext/hash_ext_test.rb
+++ b/activesupport/test/core_ext/hash_ext_test.rb
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/../../lib/active_support/core_ext/hash'
class HashExtTest < Test::Unit::TestCase
def setup
+
@strings = { 'a' => 1, 'b' => 2 }
@symbols = { :a => 1, :b => 2 }
@mixed = { :a => 1, 'b' => 2 }
@@ -31,7 +32,7 @@ class HashExtTest < Test::Unit::TestCase
assert_equal @symbols, @strings.dup.symbolize_keys!
assert_equal @symbols, @mixed.dup.symbolize_keys!
- assert_raises(NoMethodError) { { [] => 1 }.symbolize_keys! }
+ assert_raises(NoMethodError) { { [] => 1 }.symbolize_keys }
end
def test_stringify_keys
@@ -50,11 +51,24 @@ class HashExtTest < Test::Unit::TestCase
@strings = @strings.with_indifferent_access
@symbols = @symbols.with_indifferent_access
@mixed = @mixed.with_indifferent_access
-
- assert_equal @strings[:a], @strings["a"]
- assert_equal @symbols[:a], @symbols["a"]
- assert_equal @strings["b"], @mixed["b"]
- assert_equal @strings[:b], @mixed["b"]
+
+ assert_equal @strings[:a], @strings['a']
+ assert_equal @symbols[:a], @symbols['a']
+ assert_equal @strings['b'], @mixed['b']
+ assert_equal @strings[:b], @mixed['b']
+ end
+
+ def test_indifferent_writing
+ hash = HashWithIndifferentAccess.new
+ hash[:a] = 1
+ hash['b'] = 2
+ hash[3] = 3
+
+ assert_equal hash['a'], 1
+ assert_equal hash['b'], 2
+ assert_equal hash[:a], 1
+ assert_equal hash[:b], 2
+ assert_equal hash[3], 3
end
def test_assert_valid_keys