目标:
向API端点发送POST请求,并使用Rails修改该资源。今天我已经犯了将近6个小时的错误,没有运气,有人能给我指出正确的方向吗?所有相关细节如下:
有关路线的routes.rb:
post '/complete_transportation_request' => 'api/transportation/complete#complete_request'
api/transportation/complete_controller.rb (处理此请求的方法:
def complete_request
@ride = Transportation.find(params["transportation"]["id"])
@ride.update(transportation_params)
end调用尝试的POST请求的文件:
require 'net/http'
require 'uri'
....
def test_post_request(result)
params = {"transportation"=>{"id"=>6, "state"=>"Complete"}}
url = URI.parse("http://localhost:3000/complete_transportation_request")
resp, data = Net::HTTP.post_form(url, params)
puts resp.inspect
puts data.inspect
puts resp.body
puts params
end引发错误:
ActiveRecord::RecordNotFound at /complete_transportation_request
找不到“id”=id的交通工具
app/controllers/api/transportation/complete_controller.rb,第10行
``` ruby5 @rides =::Transportation.where(状态:“完全”)
6端
7
8
9 def complete_request
10 @ride = Transportation.find(params"transportation") 11 @ride.update(transportation_params)
12端
13
14名私人
15
编辑1:在失败点上的:
[2] pry(#<Api::Transportation::CompleteController>)> params
=> nil编辑2:在故障点完全输出:
Started POST "/complete_transportation_request" for ::1 at 2015-08-23 19:58:49 -0700
Processing by Api::Transportation::CompleteController#complete_request as */*
Parameters: {"transportation"=>"{\"id\"=>\"6\", \"state\"=>\"Complete\"}"}
"Id = id"
From: .... line 11 Api::Transportation::CompleteController#complete_request:
9: def complete_request
10: p "Id = #{params["transportation"]["id"]}"
11: binding.pry
12: params = JSON.parse(params)
13: @ride = Transportation.find(params["transportation"]["id"])
14: @ride.update(transportation_params)
15: end
[1] pry(#<Api::Transportation::CompleteController>)> params
=> nil编辑3:我错过了什么?参数似乎就在请求的日志中!
Started POST "/complete_transportation_request" for ::1 at 2015-08-23 21:37:18 -0700
Processing by Api::Transportation::CompleteController#complete_request as */*
Parameters: {"id"=>"7", "state"=>"Complete"}
From: ...../app/controllers/api/transportation/complete_controller.rb @ line 11 Api::Transportation::CompleteController#complete_request:
10: def complete_request
=> 11: binding.pry
12: params = JSON.parse(params)
13: @ride = Transportation.find(params["transportation"]["id"])
14: @ride.update(transportation_params)
15: end
[1] pry(#<Api::Transportation::CompleteController>)> params
=> nil发布于 2015-08-24 08:01:26
“编辑2”中的问题:确保请求中的content-type和accepts标头都包含application/json,而不是包含text/json,或者您没有执行一些奇怪的操作,比如在基本HTTP表单中的“传输”文本字段中插入json原始字符串。如果您仍然有问题,在结尾添加.json可能会起作用
在“编辑3”中出现问题,请务必查找params['id']而不是params['transportation']['id']。
而且,您可以将一些东西混合在一起,但是不能很好地混合,post_form发送一个表单,比如在一个HTML页面上,Rails中的表单通常是嵌套的--它们有一个根节点,比如‘传输’,XML也是嵌套的,JSON的不是嵌套的,除非你插入额外的中间件来强制它这样做,
使用curl测试控制器:
curl -H "Content-Type: application/json" -H "Accept: application/json" -k -i -d '{"id": "2874"}' http://localhost:3000/complete_transportation_request.json并使用find params['id']获取记录。
https://stackoverflow.com/questions/32173496
复制相似问题