0

在我的 rails 应用程序中,我有一个Item模型,其中有很多Versions. 我的控制器有一个versions动作。

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,所以我没有想法。

4

2 回答 2

2

SET log_statement='all';重新您的 SQL 日志记录:通过在打开每个连接时发出 SQL 来启用语句日志记录。然后检查 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

于 2012-08-28T02:58:54.583 回答
0

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

感谢克雷格的帮助。

于 2012-08-28T05:34:01.017 回答