From 273045d6d5c5f68e38f917e8ab4b1ad533d23aac Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Sat, 21 Dec 2013 14:22:08 +0100 Subject: optimizes array conversion in AC::Parameters --- .../lib/action_controller/metal/strong_parameters.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'actionpack/lib') 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 -- cgit v1.2.3