未验证 提交 fd132d0d 编写于 作者: R Rafael França 提交者: GitHub

Merge pull request #33341 from Edouard-chin/ec-fix-to-param

e4e1b620 broke `to_param` handling:
......@@ -109,7 +109,7 @@ def assign_parameters(routes, controller_path, action, parameters, generated_pat
when :xml
data = non_path_parameters.to_xml
when :url_encoded_form
data = Rack::Utils.build_nested_query(non_path_parameters)
data = non_path_parameters.to_query
else
@custom_param_parsers[content_mime_type.symbol] = ->(_) { non_path_parameters }
data = non_path_parameters.to_query
......
......@@ -220,7 +220,7 @@ def test_raw_post_handling
params = Hash[:page, { name: "page name" }, "some key", 123]
post :render_raw_post, params: params.dup
assert_equal Rack::Utils.build_nested_query(params), @response.body
assert_equal params.to_query, @response.body
end
def test_params_round_trip
......@@ -231,12 +231,25 @@ def test_params_round_trip
assert_equal params.merge(controller_info), JSON.parse(@response.body)
end
def test_handle_to_params
klass = Class.new do
def to_param
"bar"
end
end
post :test_params, params: { foo: klass.new }
assert_equal JSON.parse(@response.body)["foo"], "bar"
end
def test_body_stream
params = Hash[:page, { name: "page name" }, "some key", 123]
post :render_body, params: params.dup
assert_equal Rack::Utils.build_nested_query(params), @response.body
assert_equal params.to_query, @response.body
end
def test_document_body_and_params_with_post
......
......@@ -75,11 +75,14 @@ class Hash
#
# This method is also aliased as +to_param+.
def to_query(namespace = nil)
collect do |key, value|
query = collect do |key, value|
unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
end
end.compact.sort! * "&"
end.compact
query.sort! unless namespace.to_s.include?("[]")
query.join("&")
end
alias_method :to_param, :to_query
......
......@@ -77,6 +77,20 @@ def test_hash_sorted_lexicographically
assert_equal "name=Nakshay&type=human", hash.to_query
end
def test_hash_not_sorted_lexicographically_for_nested_structure
params = {
"foo" => {
"contents" => [
{ "name" => "gorby", "id" => "123" },
{ "name" => "puff", "d" => "true" }
]
}
}
expected = "foo[contents][][name]=gorby&foo[contents][][id]=123&foo[contents][][name]=puff&foo[contents][][d]=true"
assert_equal expected, URI.decode(params.to_query)
end
private
def assert_query_equal(expected, actual)
assert_equal expected.split("&"), actual.to_query.split("&")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册