首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发布JSON,通过API更新Rails资源

发布JSON,通过API更新Rails资源
EN

Stack Overflow用户
提问于 2015-08-24 01:57:03
回答 1查看 1.3K关注 0票数 1

目标:

向API端点发送POST请求,并使用Rails修改该资源。今天我已经犯了将近6个小时的错误,没有运气,有人能给我指出正确的方向吗?所有相关细节如下:

有关路线的routes.rb

post '/complete_transportation_request' => 'api/transportation/complete#complete_request'

api/transportation/complete_controller.rb (处理此请求的方法:

代码语言:javascript
复制
def complete_request
 @ride = Transportation.find(params["transportation"]["id"])
 @ride.update(transportation_params)
end

调用尝试的POST请求的文件:

代码语言:javascript
复制
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行

代码语言:javascript
复制
``` ruby

5 @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

代码语言:javascript
复制

编辑1:在失败点上的:

代码语言:javascript
复制
[2] pry(#<Api::Transportation::CompleteController>)> params
=> nil

编辑2:在故障点完全输出:

代码语言:javascript
复制
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:我错过了什么?参数似乎就在请求的日志中!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2015-08-24 08:01:26

“编辑2”中的问题:确保请求中的content-typeaccepts标头都包含application/json,而不是包含text/json,或者您没有执行一些奇怪的操作,比如在基本HTTP表单中的“传输”文本字段中插入json原始字符串。如果您仍然有问题,在结尾添加.json可能会起作用

在“编辑3”中出现问题,请务必查找params['id']而不是params['transportation']['id']

而且,您可以将一些东西混合在一起,但是不能很好地混合,post_form发送一个表单,比如在一个HTML页面上,Rails中的表单通常是嵌套的--它们有一个根节点,比如‘传输’,XML也是嵌套的,JSON的不是嵌套的,除非你插入额外的中间件来强制它这样做,

使用curl测试控制器:

代码语言:javascript
复制
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']获取记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32173496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档