From af7ff289a569823d289c58742b5bbb9dc539fb15 Mon Sep 17 00:00:00 2001 From: John Pignata Date: Sat, 31 Mar 2012 12:37:31 -0400 Subject: [PATCH] Allow filters to match multi-parameter attributes --- lib/action_controller/parameters.rb | 12 ++++++++- test/multi_parameter_attributes_test.rb | 33 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/multi_parameter_attributes_test.rb diff --git a/lib/action_controller/parameters.rb b/lib/action_controller/parameters.rb index daaf901..1acda2d 100644 --- a/lib/action_controller/parameters.rb +++ b/lib/action_controller/parameters.rb @@ -29,7 +29,7 @@ def permit! def require(key) self[key].presence || raise(ActionController::ParameterMissing.new(key)) end - + alias :required :require def permit(*filters) @@ -39,6 +39,10 @@ def permit(*filters) case filter when Symbol then params[filter] = self[filter] if has_key?(filter) + + multi_param_keys_for(filter).each do |multi_filter| + params[multi_filter] = self[multi_filter] + end when Hash then self.slice(*filter.keys).each do |key, value| return unless value @@ -97,6 +101,12 @@ def each_element(object) yield object end end + + def multi_param_keys_for(filter) + keys.select { |key| + key.index("#{filter}(") == 0 && key.index(")") == key.length - 1 + } + end end module StrongParameters diff --git a/test/multi_parameter_attributes_test.rb b/test/multi_parameter_attributes_test.rb new file mode 100644 index 0000000..b775fc9 --- /dev/null +++ b/test/multi_parameter_attributes_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' +require 'action_controller/parameters' + +class MultiParameterAttributesTest < ActiveSupport::TestCase + test "permitted multi-parameter attribute keys" do + params = ActionController::Parameters.new({ + book: { + "shipped_at(1i)" => "2012", + "shipped_at(2i)" => "3", + "shipped_at(3i)" => "25", + "shipped_at(4i)" => "10", + "shipped_at(5i)" => "15", + "published_at(1i)" => "1999", + "published_at(2i)" => "2", + "published_at(3i)" => "5" + } + }) + + permitted = params.permit book: [ :shipped_at ] + + assert permitted.permitted? + + assert_equal "2012", permitted[:book]["shipped_at(1i)"] + assert_equal "3", permitted[:book]["shipped_at(2i)"] + assert_equal "25", permitted[:book]["shipped_at(3i)"] + assert_equal "10", permitted[:book]["shipped_at(4i)"] + assert_equal "15", permitted[:book]["shipped_at(5i)"] + + assert_nil permitted[:book]["published_at(1i)"] + assert_nil permitted[:book]["published_at(2i)"] + assert_nil permitted[:book]["published_at(3i)"] + end +end