Skip to content

Commit d663c19

Browse files
committed
Merge pull request rails#12354 from kennyj/fix_12293
Closes rails#12293. Strong parameters should permit nested number as key. Conflicts: actionpack/CHANGELOG.md
1 parent d62a95a commit d663c19

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

actionpack/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## unreleased ##
22

3+
* Strong parameters should permit nested number as key.
4+
5+
Fixes #12293
6+
7+
*kennyj*
8+
39
* Fix `collection_check_boxes` generated hidden input to use the name attribute provided
410
in the options hash.
511

actionpack/lib/action_controller/metal/strong_parameters.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def convert_hashes_to_parameters(key, value)
329329
def each_element(object)
330330
if object.is_a?(Array)
331331
object.map { |el| yield el }.compact
332-
elsif object.is_a?(Hash) && object.keys.all? { |k| k =~ /\A-?\d+\z/ }
332+
elsif fields_for_style?(object)
333333
hash = object.class.new
334334
object.each { |k,v| hash[k] = yield v }
335335
hash
@@ -338,6 +338,10 @@ def each_element(object)
338338
end
339339
end
340340

341+
def fields_for_style?(object)
342+
object.is_a?(Hash) && object.all? { |k, v| k =~ /\A-?\d+\z/ && v.is_a?(Hash) }
343+
end
344+
341345
def unpermitted_parameters!(params)
342346
unpermitted_keys = unpermitted_keys(params)
343347
if unpermitted_keys.any?

actionpack/test/controller/parameters/nested_parameters_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,19 @@ def assert_filtered_out(params, key)
169169

170170
assert_filtered_out permitted[:book][:authors_attributes]['-1'], :age_of_death
171171
end
172+
173+
test "nested number as key" do
174+
params = ActionController::Parameters.new({
175+
product: {
176+
properties: {
177+
'0' => "prop0",
178+
'1' => "prop1"
179+
}
180+
}
181+
})
182+
params = params.require(:product).permit(:properties => ["0"])
183+
assert_not_nil params[:properties]["0"]
184+
assert_nil params[:properties]["1"]
185+
assert_equal "prop0", params[:properties]["0"]
186+
end
172187
end

0 commit comments

Comments
 (0)