2012-08-28 186 views
0

在我的Rails应用程序中,我有一个Item模型,它有很多Versions。我的控制器有一个versions操作。JSON请求返回两个响应

def versions 
    @item = Item.find(params[:id]) 
    respond_to do |format| 
    format.json { render json: @item.versions } 
    end 
end 

每当我请求版本,有些项目会成功返回它们,有些则不成功。但是当我进入控制台时,我可以毫无问题地获取所有项目的版本。

成功(返回版本的JSON数组):

Started GET "/api/versions/4.json?" 
Processing by ItemsController#versions as JSON 
Parameters: {"id"=>"4"} 
Completed 200 OK in 106ms (Views: 0.1ms | ActiveRecord: 19.8ms) 
app[web.1]: cache: [GET /api/versions/4.json?] miss 
heroku[router]: GET x.x.com/api/versions/4.json? dyno=web.1 queue=0 wait=0ms service=113ms status=200 bytes=831 

没有成功(返回两个反应,无论状态200,没有JSON数据):

Started GET "/api/versions/1.json?" 
Processing by ItemsController#versions as JSON 
Parameters: {"id"=>"1"} 
Completed 200 OK in 249ms (Views: 0.1ms | ActiveRecord: 162.9ms) 
app[web.1]: cache: [GET /api/versions/1.json?] miss 
heroku[router]: GET x.x.com/api/versions/1.json? dyno=web.1 queue=0 wait=0ms service=257ms status=200 bytes=3540 

任何想法可能是什么原因?我不知道如何在Heroku上登录SQL,所以我没有想法。

回答

0

这实际上是客户端的错误。在iOS上,我正在处理connection:didReceiveData:中的返回数据,该数据(在返回大块数据时)会多次调用部分结果。为了解决这个问题,我将这个回调中的所有部分结果连接起来,并处理了connectionDidFinishLoading:中的数据。愚蠢的错误,与Heroku或Rails无关。

感谢您的帮助克雷格。

2

重新进行SQL日志记录:通过在打开每个连接时发出SQL SET log_statement='all';来启用语句日志记录。然后检查PG的Heroku日志以查看发生了什么。

heroku logs --ps postgres 

参见:

这将不记录查询结果,仅查询文本,查询参数和错误/成功。

要处理结果记录,您需要在应用程序中执行此操作;只需将消息打印到stderr,Heroku会将它们添加到应用程序日志中,以便通过heroku logs获取它们。

无论如何,您目前的代码看起来有些狡猾。循环结果集和发射json感觉不对:

  • 它不明确只有一个结果,因此只发出一个json块;和
  • 如果没有结果,没有JSON是发出

相反,节省查找的结果 - 如果有的话 - 一个变量。然后正确处理缺失的结果:在RESTful API中,您可能会报告HTTP状态404 Not Found;在更多RPC风格的API中,您将返回一个空的JSON文档或带有某种“未找到”标志的JSON文档,并报告HTTP状态200 OK