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) |