我有控制器方法为POST发送json params执行一些操作,但问题是当我尝试发送没有json头的json params时。
我想通过将字符串转换为json来处理此异常,此处问题就开始了。
假设我有这样简单的JSON:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
我已将binding.pry
置于方法的开头,我试图从那里获得参数。我发现request.body
将返回我必须转换为JSON的对象#<StringIO:0x007fbdb5cf9fe8>
。
我尝试的第一件事是:
[1] pry(#<TestController>)> request.body.to_json
=> "[\"{\\\"menu\\\": {\\n\",\" \\\"id\\\": \\\"file\\\",\\n\",\" \\\"value\\\": \\\"File\\\",\\n\",\" \\\"popup\\\": {\\n\",\" \\\"menuitem\\\": [\\n\",\" {\\\"value\\\": \\\"New\\\", \\\"onclick\\\": \\\"CreateNewDoc()\\\"},\\n\",\" {\\\"value\\\": \\\"Open\\\", \\\"onclick\\\": \\\"OpenDoc()\\\"},\\n\",\" {\\\"value\\\": \\\"Close\\\", \\\"onclick\\\": \\\"CloseDoc()\\\"}\\n\",\" ]\\n\",\" }\\n\",\"}}\"]"
但这不是我想要的结果。
我尝试过几个转换器,比如:
[2] pry(#<TestsController>)> ActiveSupport::JSON.decode(request.body.to_json)
=> []
这也没有给我什么。我没有想法。 我想得到这样的东西:
[1] pry(#<TestsController>)> params
=> {"menu"=>{"id"=>"file", "value"=>"File", "popup"=>{"menuitem"=>[{"value"=>"New", "onclick"=>"CreateNewDoc()"}, {"value"=>"Open", "onclick"=>"OpenDoc()"}, {"value"=>"Close", "onclick"=>"CloseDoc()"}]}},
"controller"=>"payments",
"action"=>"notification",
"payment"=>{"menu"=>{"id"=>"file", "value"=>"File", "popup"=>{"menuitem"=>[{"value"=>"New", "onclick"=>"CreateNewDoc()"}, {"value"=>"Open", "onclick"=>"OpenDoc()"}, {"value"=>"Close", "onclick"=>"CloseDoc()"}]}}}}
这是使用json标头发送params的方案。在那,我可以轻松地遍历它们。
答案 0 :(得分:6)
您应该在JSON.parse
request.body.read
request.body.rewind
JSON.parse(request.body.read)
答案 1 :(得分:2)
你试过吗? request.body替换为env [&#39; rack.input&#39;]。读取
json = JSON.parse env['rack.input'].read
OR
json = JSON.parse request.body.read
如所述here
答案 2 :(得分:1)
由于您使用的是RoR,如果您使用的是Action Controller Parameters,则可以使用to_hash
方法,然后使用to_json
(仅在RoR上,而不是Ruby的一部分)进行转换你允许的参数,如下:
params.permit(:attributes).to_hash.to_json
答案 3 :(得分:1)
在我看来,这可行:
JSON.parse(params[:attributes].to_json)