【问题标题】:Post JSON to update Rails resource through API通过 API 发布 JSON 以更新 Rails 资源
【发布时间】:2015-11-17 08:33:57
【问题描述】:

目标:
向 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 行

``` ruby
5       @rides = ::Transportation.where(state: "Complete")
6     end
7   
8   
9     def complete_request
>  10       @ride = Transportation.find(params["transportation"]["id"])
11       @ride.update(transportation_params)
12     end
13   
14     private
15   
```

编辑 1:params 在故障点:

[2] pry(#<Api::Transportation::CompleteController>)> params
=> nil

编辑 2:故障点处的完整 pry 输出:

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

【问题讨论】:

  • complete_request 中尝试p params 看看会发生什么。
  • 能否请您在第 10 行之前添加这一行:p "Id = #{params["transportation"]["id"]}",让我们知道会发生什么?
  • params 出现为零 - 我将使用该信息更新我的问题.. 所以参数在失败时为零,这一定是 POST 本身的问题,对吧?
  • 很可能...您介意在您的问题中添加 POST 事件的 rails 日志文件吗?
  • 是的,我刚刚将其添加到问题中

标签: ruby-on-rails ruby json net-http


【解决方案1】:

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

“编辑 3”中的问题,请尝试查找 params['id'] 而不是 params['transportation']['id']

另外,你把一些东西混合在一起,混合得不好,post_form 发送一个表单,就像在 HTML 页面上一样,Rails 中的表单通常是嵌套的——它们有一个像“transportation”这样的根节点,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'] 获取记录

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多