Do not discard query parameters on requests that use wrap_parameters

This commit is contained in:
Josh Jordan 2014-01-28 16:51:01 -05:00
parent b9cd5a29dd
commit 1f9586fd47
3 changed files with 36 additions and 4 deletions

View File

@ -1,3 +1,8 @@
* Do not discard query parameters that form a hash with the same root key as
the wrapper_key for a request using wrap_parameters
*Josh Jordan*
* Ensure that `request.filtered_parameters` is reset between calls to `process`
in `ActionController::TestCase`.

View File

@ -231,7 +231,12 @@ module ActionController
# by the metal call stack.
def process_action(*args)
if _wrapper_enabled?
wrapped_hash = _wrap_parameters request.request_parameters
if request.parameters[_wrapper_key].present?
wrapped_hash = _extract_parameters(request.parameters)
else
wrapped_hash = _wrap_parameters request.request_parameters
end
wrapped_keys = request.request_parameters.keys
wrapped_filtered_hash = _wrap_parameters request.filtered_parameters.slice(*wrapped_keys)
@ -259,14 +264,16 @@ module ActionController
# Returns the list of parameters which will be selected for wrapped.
def _wrap_parameters(parameters)
value = if include_only = _wrapper_options.include
{ _wrapper_key => _extract_parameters(parameters) }
end
def _extract_parameters(parameters)
if include_only = _wrapper_options.include
parameters.slice(*include_only)
else
exclude = _wrapper_options.exclude || []
parameters.except(*(exclude + EXCLUDE_PARAMETERS))
end
{ _wrapper_key => value }
end
# Checks if we should perform parameters wrapping.

View File

@ -188,6 +188,26 @@ class ParamsWrapperTest < ActionController::TestCase
assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }})
end
end
def test_preserves_query_string_params
with_default_wrapper_options do
@request.env['CONTENT_TYPE'] = 'application/json'
get :parse, { 'user' => { 'username' => 'nixon' } }
assert_parameters(
{'user' => { 'username' => 'nixon' } }
)
end
end
def test_empty_parameter_set
with_default_wrapper_options do
@request.env['CONTENT_TYPE'] = 'application/json'
post :parse, {}
assert_parameters(
{'user' => { } }
)
end
end
end
class NamespacedParamsWrapperTest < ActionController::TestCase