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