Permalink
Browse files

Add `ActionController::Parameters#dig`

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 5cd2beb0135faf18c978507a4be272dfc1499bb8
@@ -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.
@@ -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.

@aruprakshit

aruprakshit Mar 12, 2016

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

This comment has been minimized.

@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.
@@ -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.