参数包装的文档指出:
将参数哈希包装成嵌套哈希。这将允许客户端提交POST请求而无需指定任何根元素。
它有益地省略了要包装哪个参数哈希。操作控制器概述指南提供了以下说明:
当您使用RESTful资源和路由时会有趣。假设您有一个模型A,它有许多B;B因此具有外键a_id。Rails收集与请求一起发送的所有参数到
params
哈希中,无论它们是作为查询字符串还是作为POST主体的一部分发送的。[...]query_parameters
哈希包含作为查询字符串发送的参数,而request_parameters
哈希包含作为POST主体的一部分发送的参数。path_parameters
哈希包含被路由识别为属于通向此特定控制器和操作的路径的参数。
您可以使用空载荷(因为B没有其他字段)
POST /as/1/bs
。假设a_id是attr_accessible,则可能会认为a_id将被包裹在一个b对象中。而实际上您将会看到:Processing by BsController#create as HTML
Parameters: {"b"=>{}, "a_id" => "1"}
没这么幸运。原来
ParamsWrapper
使用request_parameters
而不是params
,所以在POST负载中不包括a_id
意味着它没有被包装。这很令人困惑,因为你仍然可以看到它包含在params
中,由于URI globbing的缘故,你会想知道为什么它被排除了。
在这里使用request_parameters
而不是params
有什么好的理由吗?
我可以理解,从"REST哲学"的角度来看,如果我们假设负载包含整个对象,那么更纯粹,但这实际上意味着URI中的a_id
完全被忽略了,这似乎很遗憾。
tl;dr: ParamsWrapper
使用request_parameters
作为参数来源,因此跳过URI-globbed变量。这是Rails的一个bug吗?纯粹的REST倡导者可能会说不是,但实用主义建议是。