跳至内容 跳至搜索

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

如果你为 `:json` 格式启用 `ParamsWrapper`,则无需像这样发送 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

对于没有设置 `:include` 或 `:exclude` 选项的 Active Record 模型,它将只包装类方法 `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 = %w(authenticity_token _method utf8)