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データなしの2つの応答を返します):

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

SQL ロギングについて:SET log_statement='all';各接続を開くときに SQL を発行して、ステートメントのロギングを有効にします。次に、Pg の Heroku ログを調べて、何が起こっているかを確認します。

heroku logs --ps postgres

見る:

これはクエリ結果をログに記録せず、クエリ テキスト、クエリ パラメータ、およびエラー/成功のみを記録します。

結果のログを処理するには、アプリケーションで行う必要があります。メッセージを stderr に出力するだけで、Heroku がそれらをアプリケーション ログに追加するので、heroku logs.

とにかく、現在のコードは危険に見えます。結果セットをループしてjsonを発行するのは間違っていると感じます:

  • 結果が 1 つしかないため、json ブロックを 1 つしか発行できないことは明確ではありません。と
  • 結果がない場合、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 に答える