Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added reverse_merge/reverse_merge! to AC::Parameters: #28355

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions actionpack/CHANGELOG.md
@@ -1,3 +1,7 @@
* Added `#reverse_merge` and `#reverse_merge!` methods to `ActionController::Parameters`

*Edouard Chin*

* Fix malformed URLS when using `ApplicationController.renderer`

The Rack environment variable `rack.url_scheme` was not being set so `scheme` was
Expand Down
15 changes: 15 additions & 0 deletions actionpack/lib/action_controller/metal/strong_parameters.rb
Expand Up @@ -660,6 +660,21 @@ def merge!(other_hash)
self
end

# Returns a new <tt>ActionController::Parameters</tt> with all keys from
# current hash merged into +other_hash+.
def reverse_merge(other_hash)
new_instance_with_inherited_permitted_status(
other_hash.to_h.merge(@parameters)
)
end

# Returns current <tt>ActionController::Parameters</tt> instance with
# current hash merged into +other_hash+.
def reverse_merge!(other_hash)
@parameters.merge!(other_hash.to_h) { |key, left, right| left }
self
end

# This is required by ActiveModel attribute assignment, so that user can
# pass +Parameters+ to a mass assignment methods in a model. It should not
# matter as we are using +HashWithIndifferentAccess+ internally.
Expand Down
29 changes: 29 additions & 0 deletions actionpack/test/controller/parameters/parameters_permit_test.rb
Expand Up @@ -302,6 +302,35 @@ def walk_permitted(params)
assert_equal "32", @params[:person][:age]
end

test "#reverse_merge with parameters" do
default_params = ActionController::Parameters.new(id: "1234", person: {}).permit!
merged_params = @params.reverse_merge(default_params)

assert_equal "1234", merged_params[:id]
refute_predicate merged_params[:person], :empty?
end

test "not permitted is sticky beyond reverse_merge!" do
merged_params = @params.reverse_merge(a: "b")

refute_predicate @params, :permitted?
end

test "permitted is sticky beyond reverse_merge!" do
@params.permit!
merged_params = @params.reverse_merge(a: "b")

assert_predicate @params, :permitted?
end

test "#reverse_merge! with parameters" do
default_params = ActionController::Parameters.new(id: "1234", person: {}).permit!
@params.reverse_merge!(default_params)

assert_equal "1234", @params[:id]
refute_predicate @params[:person], :empty?
end

test "modifying the parameters" do
@params[:person][:hometown] = "Chicago"
@params[:person][:family] = { brother: "Jonas" }
Expand Down