aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/metal/strong_parameters.rb
diff options
context:
space:
mode:
authorXavier Noria <fxn@hashref.com>2013-12-21 14:22:08 +0100
committerXavier Noria <fxn@hashref.com>2013-12-21 14:22:08 +0100
commit273045d6d5c5f68e38f917e8ab4b1ad533d23aac (patch)
tree4b92a4692d1d244bb902fa17c4f503b62552615f /actionpack/lib/action_controller/metal/strong_parameters.rb
parent269424b0bb8c103418d8a948bf88ca708350ebff (diff)
downloadrails-273045d6d5c5f68e38f917e8ab4b1ad533d23aac.tar.gz
rails-273045d6d5c5f68e38f917e8ab4b1ad533d23aac.tar.bz2
rails-273045d6d5c5f68e38f917e8ab4b1ad533d23aac.zip
optimizes array conversion in AC::Parameters
Diffstat (limited to 'actionpack/lib/action_controller/metal/strong_parameters.rb')
-rw-r--r--actionpack/lib/action_controller/metal/strong_parameters.rb14
1 files changed, 12 insertions, 2 deletions
diff --git a/actionpack/lib/action_controller/metal/strong_parameters.rb b/actionpack/lib/action_controller/metal/strong_parameters.rb
index 1c06d9a7db..41be1b121e 100644
--- a/actionpack/lib/action_controller/metal/strong_parameters.rb
+++ b/actionpack/lib/action_controller/metal/strong_parameters.rb
@@ -3,6 +3,7 @@ require 'active_support/core_ext/array/wrap'
require 'active_support/rescuable'
require 'action_dispatch/http/upload'
require 'stringio'
+require 'set'
module ActionController
# Raised when a required parameter is missing.
@@ -125,6 +126,13 @@ module ActionController
@permitted = self.class.permit_all_parameters
end
+ # Attribute that keeps track of converted arrays, if any, to avoid double
+ # looping in the common use case permit + mass-assignment. Defined in a
+ # method to instantiate it only if needed.
+ def converted_arrays
+ @converted_arrays ||= Set.new
+ end
+
# Returns +true+ if the parameter is permitted, +false+ otherwise.
#
# params = ActionController::Parameters.new
@@ -329,8 +337,10 @@ module ActionController
end
def convert_value_to_parameters(value)
- if value.is_a?(Array)
- value.map { |_| convert_value_to_parameters(_) }
+ if value.is_a?(Array) && !converted_arrays.member?(value)
+ converted = value.map { |_| convert_value_to_parameters(_) }
+ converted_arrays << converted
+ converted
elsif value.is_a?(Parameters) || !value.is_a?(Hash)
value
else