модуль ActionController::ParamsWrapper
Оборачивает хеш параметров в вложенный хеш. Это позволит клиентам отправлять запросы без необходимости указывать корневые элементы.
Эта функциональность включена в config/initializers/wrap_parameters.rb и может быть настраиваема. Если вы обновляетесь до Rails 3.1, этот файл необходимо будет создать, чтобы включить эту функциональность.
Вы также можете включить её для конкретного контроллера, задав массив форматов непустым:
class UsersController < ApplicationController wrap_parameters format: [:json, :xml, :url_encoded_form, :multipart_form] end
Если вы включите ParamsWrapper для формата :json, вместо того, чтобы отправлять JSON параметры так:
{"user": {"name": "Konata"}}
Вы можете отправлять параметры так:
{"name": "Konata"}
И они будут обернуты во вложенный хеш с именем ключа, соответствующим имени контроллера. Например, если вы отправляете данные на UsersController, ваш новый params хеш будет выглядеть так:
{"name" => "Konata", "user" => {"name" => "Konata"}}
Вы также можете указать ключ, в который должны быть обернуты параметры, а также список атрибутов, которые нужно обернуть, используя :include или :exclude опции, например так:
class UsersController < ApplicationController wrap_parameters :person, include: [:username, :password] end
Для моделей ActiveRecord без заданных опций :include или :exclude, будут обернуты только параметры, возвращаемые методом класса attribute_names.
Если вы собираетесь передавать параметры объекту ActiveModel (такому как User.new(params[:user])), вы можете рассмотреть возможность передачи класса модели в метод вместо этого. ParamsWrapper фактически попытается определить список имён атрибутов из модели и обернуть только эти атрибуты:
class UsersController < ApplicationController wrap_parameters Person end
Вы всё равно можете передать :include и :exclude для задания списка атрибутов, которые нужно обернуть.
По умолчанию, если вы не указываете ключ, в который должны быть обернуты параметры, ParamsWrapper фактически попытается определить, есть ли связанная с ним модель. Например, этот контроллер:
class Admin::UsersController < ApplicationController end
попытается проверить, существуют ли модели Admin::User или User, и использовать их для определения ключа обертки соответственно. Если обе модели не существуют, он затем вернётся к использованию user в качестве ключа.
Постоянные
- EXCLUDE_PARAMETERS
Публичные методы экземпляра
# File actionpack/lib/action_controller/metal/params_wrapper.rb, line 232
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 Выполняет обёртку параметров для запроса. Будет вызываться автоматически стеком вызовов мета.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.