我发送一个应用程序/json 发布请求:
curl 'http://127.0.0.1:3000/api/flowers/growth' -H 'Content-Type:application/json' -d '{"type": 1}'
然后我使用request.request_parameters,输出为:
{"type"=>1, "flower"=>{}}
为什么会自动添加“flower”=>{}?
我怎样才能只获取 POST 数据,而不包括控制器信息
我发送一个应用程序/json 发布请求:
curl 'http://127.0.0.1:3000/api/flowers/growth' -H 'Content-Type:application/json' -d '{"type": 1}'
然后我使用request.request_parameters,输出为:
{"type"=>1, "flower"=>{}}
为什么会自动添加“flower”=>{}?
我怎样才能只获取 POST 数据,而不包括控制器信息
好的,在我自己在这个确切的问题上苦苦挣扎了几个小时,并通过调用堆栈挖掘之后,我找到了答案。
首先,我想解决这个问题的原因是因为如果使用了无效元素,我想向发送者提供反馈,而不是仅仅接受有效值而忽略其他值。因此,此页面上的其他解决方案对我不起作用。
所以问题的关键是这个叫做 的东西ActionController::ParamsWrapper
,它位于actionpack-4.2.3/lib/action_controller/metal/params_wrapper.rb
. 此代码将控制器的请求参数包装在控制器名称中,以使访问更容易。然而,如果你有一个专用的 api JSON 接口,这只会让生活变得更糟。
要告诉这个急切的“帮手”,请在您的控制器中添加以下行:
wrap_parameters format: []
您可以使用它slice
来获取您正在寻找的参数:
request.request_parameters.slice(:type) #=> { 'type' => 1 }
也可以params
用作request.request_parameters
. params
虽然有一些额外的信息。
在很多情况下使用params.slice
或类似方法是不可行的(您可能不知道将传入哪些参数),您只需要获取 POST 参数。在这种情况下,您可以request.POST
在控制器中使用。
伙计,你为什么不使用params
哈希?
params[:type]