2012-08-28 233 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