модуль ActionController::ParamsWrapper
Обёртка параметров Action Controller
Оборачивает хеш параметров в вложенный хеш. Это позволит клиентам отправлять запросы без необходимости указывать корневые элементы.
Эта функциональность включена по умолчанию для 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.