module ActionController::ParamsWrapper
Wraps the parameters hash into a nested hash. This will allow clients to submit requests without having to specify any root elements.
This functionality is enabled in
config/initializers/wrap_parameters.rb
and can be customized.
You could also turn it on per controller by setting the format array to a non-empty array:
class UsersController < ApplicationController wrap_parameters format: [:json, :xml, :url_encoded_form, :multipart_form] end
If you enable ParamsWrapper
for :json
format,
instead of having to send JSON parameters like this:
{"user": {"name": "Konata"}}
You can send parameters like this:
{"name": "Konata"}
And it will be wrapped into a nested hash with the key name matching the
controller's name. For example, if you're posting to
UsersController
, your new params
hash will look
like this:
{"name" => "Konata", "user" => {"name" => "Konata"}}
You can also specify the key in which the parameters should be wrapped to,
and also the list of attributes it should wrap by using either
:include
or :exclude
options like this:
class UsersController < ApplicationController wrap_parameters :person, include: [:username, :password] end
On Active Record models with no :include
or
:exclude
option set, it will only wrap the parameters returned
by the class method attribute_names
.
If you're going to pass the parameters to an ActiveModel
object (such as User.new(params[:user])
), you might consider
passing the model class to the method instead. The
ParamsWrapper
will actually try to determine the list of
attribute names from the model and only wrap those attributes:
class UsersController < ApplicationController wrap_parameters Person end
You still could pass :include
and :exclude
to set
the list of attributes you want to wrap.
By default, if you don't specify the key in which the parameters would
be wrapped to, ParamsWrapper
will actually try to determine if
there's a model related to it or not. This controller, for example:
class Admin::UsersController < ApplicationController end
will try to check if Admin::User
or User
model
exists, and use it to determine the wrapper key respectively. If both
models don't exist, it will then fallback to use user
as
the key.
Constants
- EXCLUDE_PARAMETERS
Public Instance Methods
Performs parameters wrapping upon the request. Called automatically by the metal call stack.
# File lib/action_controller/metal/params_wrapper.rb, line 234 def process_action(*args) if _wrapper_enabled? 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) # This will make the wrapped hash accessible from controller and view. request.parameters.merge! wrapped_hash request.request_parameters.merge! wrapped_hash # This will display the wrapped hash in the log file. request.filtered_parameters.merge! wrapped_filtered_hash end super end
Private Instance Methods
# File lib/action_controller/metal/params_wrapper.rb, line 272 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 end
Returns the list of parameters which will be selected for wrapped.
# File lib/action_controller/metal/params_wrapper.rb, line 268 def _wrap_parameters(parameters) { _wrapper_key => _extract_parameters(parameters) } end
Checks if we should perform parameters wrapping.
# File lib/action_controller/metal/params_wrapper.rb, line 282 def _wrapper_enabled? return false unless request.has_content_type? ref = request.content_mime_type.ref _wrapper_formats.include?(ref) && _wrapper_key && !request.request_parameters[_wrapper_key] end
Returns the list of enabled formats.
# File lib/action_controller/metal/params_wrapper.rb, line 263 def _wrapper_formats _wrapper_options.format end
Returns the wrapper key which will be used to store wrapped parameters.
# File lib/action_controller/metal/params_wrapper.rb, line 258 def _wrapper_key _wrapper_options.name end