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