Skip to content

Commit 9d2a7f8

Browse files
committed
Prevent NoMethodError in extract_value when specifying non-existent keys
Introduced in rails#49042, the method `ActionController::Parameters#extract_value` promises to replace utility methods that were previously defined as private methods in controllers. However, it currently throws a `NoMethodError` when passed a non-existent key. `params` is dependent on client requests and is thus beyond the application's control. Rather than throwing a `NoMethodError`, it would be more convenient for the method to return `nil`.
1 parent eab51d8 commit 9d2a7f8

File tree

2 files changed

+3
-1
lines changed

2 files changed

+3
-1
lines changed

actionpack/lib/action_controller/metal/strong_parameters.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -931,8 +931,9 @@ def deep_dup
931931
# params = ActionController::Parameters.new(id: "1_123", tags: "ruby,rails")
932932
# params.extract_value(:id) # => ["1", "123"]
933933
# params.extract_value(:tags, delimiter: ",") # => ["ruby", "rails"]
934+
# params.extract_value(:non_existent_key) # => nil
934935
def extract_value(key, delimiter: "_")
935-
@parameters[key].split(delimiter)
936+
@parameters[key]&.split(delimiter)
936937
end
937938

938939
protected

actionpack/test/controller/parameters/accessors_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,5 +430,6 @@ class ParametersAccessorsTest < ActiveSupport::TestCase
430430

431431
assert_equal(["1", "123"], params.extract_value(:id))
432432
assert_equal(["ruby", "rails", "web"], params.extract_value(:tags, delimiter: ","))
433+
assert_nil(params.extract_value(:non_existent_key))
433434
end
434435
end

0 commit comments

Comments
 (0)