跳至内容 跳至搜索

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::UserUser 模型是否存在,并分别使用它们来确定包装键。如果两个模型都不存在,它将回退到使用 user 作为键。

要为控制器禁用此功能

class UsersController < ApplicationController
  wrap_parameters false
end
命名空间

常量

EXCLUDE_PARAMETERS = %w(authenticity_token _method utf8)