diff options
author | José Valim <jose.valim@gmail.com> | 2011-05-08 03:44:27 -0700 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2011-05-08 03:44:27 -0700 |
commit | c2b55c4fbfc427e9ca468fce0392de591c87747a (patch) | |
tree | 40d6cb605293f78791633ce7a5b8a5279fc4ac41 /activesupport/lib | |
parent | e5a01224195b289748b3996e6deb0587baf625d8 (diff) | |
parent | 099eb2b3fd9526e06c30b9878780f31091e011aa (diff) | |
download | rails-c2b55c4fbfc427e9ca468fce0392de591c87747a.tar.gz rails-c2b55c4fbfc427e9ca468fce0392de591c87747a.tar.bz2 rails-c2b55c4fbfc427e9ca468fce0392de591c87747a.zip |
Merge pull request #454 from dlee/nested_indifferent_access
indifferent access should recurse Hash subclasses
Diffstat (limited to 'activesupport/lib')
3 files changed, 18 insertions, 2 deletions
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 aad4b61e16..c2a6476604 100644 --- a/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +++ b/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb @@ -9,4 +9,16 @@ class Hash def with_indifferent_access ActiveSupport::HashWithIndifferentAccess.new_from_hash_copying_default(self) end + + # Called when object is nested under an object that receives + # #with_indifferent_access. This method with be called on the current object + # by the enclosing object and is aliased to #with_indifferent_access by + # default. Subclasses of Hash may overwrite this method to return +self+ if + # converting to an +ActiveSupport::HashWithIndifferentAccess+ would not be + # desirable. + # + # b = {:b => 1} + # {:a => b}.with_indifferent_access["a"] # calls b.nested_under_indifferent_access + # + alias nested_under_indifferent_access with_indifferent_access end diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb index 79a0de7940..8ec4f6e09a 100644 --- a/activesupport/lib/active_support/hash_with_indifferent_access.rb +++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb @@ -140,8 +140,8 @@ module ActiveSupport end def convert_value(value) - if value.class == Hash - self.class.new_from_hash_copying_default(value) + if value.is_a? Hash + value.nested_under_indifferent_access elsif value.is_a?(Array) value.dup.replace(value.map { |e| convert_value(e) }) else diff --git a/activesupport/lib/active_support/ordered_hash.rb b/activesupport/lib/active_support/ordered_hash.rb index fbc40d1b69..762a64a881 100644 --- a/activesupport/lib/active_support/ordered_hash.rb +++ b/activesupport/lib/active_support/ordered_hash.rb @@ -43,6 +43,10 @@ module ActiveSupport end end + def nested_under_indifferent_access + self + end + # Hash is ordered in Ruby 1.9! if RUBY_VERSION < '1.9' |