Skip to content

Commit

Permalink
Add ActionController::Parameters#dig
Browse files Browse the repository at this point in the history
This method will only be added when used with Ruby 2.3.0 or greater.
This method has the same behavior as `Hash#dig`, except it will convert
hashes to `ActionController::Parameters`, similar to `#[]` and `#fetch`.
  • Loading branch information
sgrif committed Mar 9, 2016
1 parent 20f2727 commit 5cd2beb
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
5 changes: 5 additions & 0 deletions actionpack/CHANGELOG.md
@@ -1,3 +1,8 @@
* Add `ActionController::Parameters#dig` on Ruby 2.3 and greater, which
behaves the same as `Hash#dig`.

*Sean Griffin*

* Add request headers in the payload of the `start_processing.action_controller`
and `process_action.action_controller` notifications.

Expand Down
15 changes: 15 additions & 0 deletions actionpack/lib/action_controller/metal/strong_parameters.rb
Expand Up @@ -430,6 +430,21 @@ def fetch(key, *args)
)
end

if Hash.method_defined?(:dig)
# Extracts the nested parameter from the given +keys+ by calling +dig+
# at each step. Returns +nil+ if any intermediate step is +nil+.
#
# params = ActionController::Parameters.new(foo: { bar: { baz: 1 } })
# params.dig(:foo, :bar, :baz) # => 1
# params.dig(:foo, :zot, :xyz) # => nil
#
# params2 = ActionController::Parameters.new(foo: [10, 11, 12])
# params2.dig(:foo, 1)

This comment has been minimized.

Copy link
@aruprakshit

aruprakshit Mar 12, 2016

@sgrif Can you add the output for params2.dig(:foo, 1) also?

This comment has been minimized.

Copy link
@prathamesh-sonpatki

prathamesh-sonpatki Mar 13, 2016

Member

It is added in subsequent commit

def dig(*keys)
convert_value_to_parameters(@parameters.dig(*keys))
end
end

# Returns a new <tt>ActionController::Parameters</tt> instance that
# includes only the given +keys+. If the given +keys+
# don't exist, returns an empty hash.
Expand Down
20 changes: 20 additions & 0 deletions actionpack/test/controller/parameters/accessors_test.rb
Expand Up @@ -194,4 +194,24 @@ class ParametersAccessorsTest < ActiveSupport::TestCase

assert_match(/permitted: true/, @params.inspect)
end

if Hash.method_defined?(:dig)
test "#dig delegates the dig method to its values" do
assert_equal "David", @params.dig(:person, :name, :first)
assert_equal "Chicago", @params.dig(:person, :addresses, 0, :city)
end

test "#dig converts hashes to parameters" do
assert_kind_of ActionController::Parameters, @params.dig(:person)
assert_kind_of ActionController::Parameters, @params.dig(:person, :addresses, 0)
assert @params.dig(:person, :addresses).all? do |value|
value.is_a?(ActionController::Parameters)
end
end
else
test "ActionController::Parameters does not respond to #dig on Ruby 2.2" do
assert_not ActionController::Parameters.method_defined?(:dig)
assert_not @params.respond_to?(:dig)
end
end
end

0 comments on commit 5cd2beb

Please sign in to comment.