aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/hash_with_indifferent_access.rb
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2013-06-03 16:46:59 -0700
committerRafael Mendonça França <rafaelmfranca@gmail.com>2013-06-03 16:46:59 -0700
commit424fa92b35231a4217574e8012d96a0954659cde (patch)
treeb69c8b51c0497d45bd253bfe64f8a9edd1627276 /activesupport/lib/active_support/hash_with_indifferent_access.rb
parent438e2ad3613f7266cfec77247ecb9b4e7c629b94 (diff)
parentc44a929f49ac17709d9efce3951b0f540ecdf8f9 (diff)
downloadrails-424fa92b35231a4217574e8012d96a0954659cde.tar.gz
rails-424fa92b35231a4217574e8012d96a0954659cde.tar.bz2
rails-424fa92b35231a4217574e8012d96a0954659cde.zip
Merge pull request #10784 from senny/10526_prevent_key_transformation
Prevent side effects in `Hash#with_indifferent_access`.
Diffstat (limited to 'activesupport/lib/active_support/hash_with_indifferent_access.rb')
-rw-r--r--activesupport/lib/active_support/hash_with_indifferent_access.rb18
1 files changed, 12 insertions, 6 deletions
diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb
index bdb8877f55..0a81a8393d 100644
--- a/activesupport/lib/active_support/hash_with_indifferent_access.rb
+++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb
@@ -91,7 +91,7 @@ module ActiveSupport
#
# This value can be later fetched using either +:key+ or +'key'+.
def []=(key, value)
- regular_writer(convert_key(key), convert_value(value))
+ regular_writer(convert_key(key), convert_value(value, for: :assignment))
end
alias_method :store, :[]=
@@ -231,7 +231,7 @@ module ActiveSupport
def to_hash
_new_hash= {}
each do |key, value|
- _new_hash[convert_key(key)] = convert_value(value, true)
+ _new_hash[convert_key(key)] = convert_value(value, for: :to_hash)
end
Hash.new(default).merge!(_new_hash)
end
@@ -241,12 +241,18 @@ module ActiveSupport
key.kind_of?(Symbol) ? key.to_s : key
end
- def convert_value(value, _convert_for_to_hash = false)
+ def convert_value(value, options = {})
if value.is_a? Hash
- _convert_for_to_hash ? value.to_hash : value.nested_under_indifferent_access
+ if options[:for] == :to_hash
+ value.to_hash
+ else
+ value.nested_under_indifferent_access
+ end
elsif value.is_a?(Array)
- value = value.dup if value.frozen?
- value.map! { |e| convert_value(e, _convert_for_to_hash) }
+ unless options[:for] == :assignment
+ value = value.dup
+ end
+ value.map! { |e| convert_value(e, options) }
else
value
end