модуль ActionController::ParamsWrapper
Обёртка параметров контроллера Action
Помещает хеш параметров во вложенный хеш. Это позволяет клиентам отправлять запросы без необходимости указывать корневые элементы.
Эта функциональность включена по умолчанию для JSON и может быть настроена с помощью массива форматов:
class ApplicationController < ActionController::Base wrap_parameters format: [:json, :xml] end
Вы также можете включить её для отдельного контроллера:
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
Для моделей Active Record, у которых не задан параметр :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.
Чтобы отключить эту функциональность для контроллера:
class UsersController < ApplicationController wrap_parameters false end
Константы
- EXCLUDE_PARAMETERS
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.