Skip to content

Commit f80ddf3

Browse files
Paxarafaelfranca
authored andcommitted
ActionController::Parameters#deep_dup (rails#26567)
* ActionController::Parameters#deep_dup * Tests for ActionController::Parameters#deep_dup * Fix test for ActionController::Parameters#deep_dup * More tests for ActionController::Parameters#deep_dup [Rafael Mendonça França + Pavel Evstigneev]
1 parent dae4044 commit f80ddf3

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

actionpack/lib/action_controller/metal/strong_parameters.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,13 @@ def init_with(coder) # :nodoc:
613613

614614
undef_method :to_param
615615

616+
# Returns duplicate of object including all parameters
617+
def deep_dup
618+
self.class.new(@parameters.deep_dup).tap do |duplicate|
619+
duplicate.permitted = @permitted
620+
end
621+
end
622+
616623
protected
617624
attr_reader :parameters
618625

actionpack/test/controller/parameters/dup_test.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require "abstract_unit"
22
require "action_controller/metal/strong_parameters"
3+
require "active_support/core_ext/object/deep_dup"
34

45
class ParametersDupTest < ActiveSupport::TestCase
56
setup do
@@ -40,4 +41,25 @@ class ParametersDupTest < ActiveSupport::TestCase
4041
dupped_params.permit!
4142
assert_not_equal @params, dupped_params
4243
end
44+
45+
test "deep_dup content" do
46+
dupped_params = @params.deep_dup
47+
dupped_params[:person][:age] = "45"
48+
dupped_params[:person][:addresses].clear
49+
50+
assert_not_equal @params[:person][:age], dupped_params[:person][:age]
51+
assert_not_equal @params[:person][:addresses], dupped_params[:person][:addresses]
52+
end
53+
54+
test "deep_dup @permitted" do
55+
dupped_params = @params.deep_dup
56+
dupped_params.permit!
57+
58+
assert_not @params.permitted?
59+
end
60+
61+
test "deep_dup @permitted is being copied" do
62+
@params.permit!
63+
assert @params.deep_dup.permitted?
64+
end
4365
end

0 commit comments

Comments
 (0)