Module: ActionController::ParamsWrapper

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
lib/action_controller/metal/params_wrapper.rb

Overview

# Action Controller Params Wrapper

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 by default for JSON, and can be customized by setting the format array:

class ApplicationController < ActionController::Base
  wrap_parameters format: [:json, :xml]
end

You could also turn it on per controller:

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)`), 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 fall back to use ‘user` as the key.

To disable this functionality for a controller:

class UsersController < ApplicationController
  wrap_parameters false
end

Defined Under Namespace

Modules: ClassMethods Classes: Options

Constant Summary collapse

EXCLUDE_PARAMETERS =
%w(authenticity_token _method utf8)