3

私はレールが初めてで、一日中答えを探していました。物乞いから始めましょう。

UI: オートコンプリートがあります (正確には、ページ上の YUI オートコンプリート)。

Y.one('input.search-from').plug(Y.Plugin.AutoComplete, {      
    resultHighlighter: 'phraseMatch',
    source: "/api/open_maps/search/{query}", 
    resultTextLocator: 'display_name'
}

ここで、「/api/open_maps/search/{query}」はレールに移動します。私の場合は、ajax の同じオリジン ポリシーを回避するためのプロキシとして採用されています。

def search
  uri = URI.parse(searchUrl(CGI.escape(params[:query])))
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)
  render :json => response.body
end

すばやく入力すると、オートコンプリータから Rails への最後の ajax リクエスト以外はすべてキャンセルされます。問題は、キャンセルされたすべてのリクエストに対してレールが醜い例外をスローしていることです。

Started GET "/api/open_maps/search/Den" for 127.0.0.1 at Sun May 06    04:20:03 +0100 2012
[2012-05-06 04:20:03] ERROR Errno::EINVAL: Invalid argument
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:324:in `write'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:324:in `<<'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:324:in `_write_data'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:296:in `send_body_string'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:187:in `send_body'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpresponse.rb:104:in `send_response'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpserver.rb:79:in `run'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
/Library/Ruby/Gems/1.8/gems/rack-1.4.1/lib/rack/handler/webrick.rb:13:in `run'
/Library/Ruby/Gems/1.8/gems/rack-1.4.1/lib/rack/server.rb:265:in `start'
/Library/Ruby/Gems/1.8/gems/railties-3.2.3/lib/rails/commands/server.rb:70:in `start'
/Library/Ruby/Gems/1.8/gems/railties-3.2.3/lib/rails/commands.rb:55
/Library/Ruby/Gems/1.8/gems/railties-3.2.3/lib/rails/commands.rb:50:in `tap'
/Library/Ruby/Gems/1.8/gems/railties-3.2.3/lib/rails/commands.rb:50
script/rails:6:in `require'
script/rails:6

さらに、Ruby はとにかくバックグラウンドでキャンセルされたリクエストを作成しているようです (すべてが遅くなります)。

私のQは:

  1. クライアントからの接続が失敗した/キャンセルされたことをレールで検出するにはどうすればよいですか?
  2. #1 がわかったら、Net::HTTP からのリクエストをキャンセルするにはどうすればよいでしょうか?

開始 -> レスキュー -> 終了ブロックを試みて、少なくとも例外をつぶしましたが、役に立ちませんでした。

4

1 に答える 1

1

トレースを見ると、エラーはNet :: HTTP内で発生したものではないため、このrescue試みは役に立ちませんでした。webrickがラック応答をブラウザに書き戻そうとすると、エラーがスローされます。

問題は、ウェブサーバーとしてmongrelthin、またはunicornをインストールすることで解決する可能性があります。WebrickはRubyに組み込まれていますが、堅牢ではないことが知られています。

于 2012-05-10T19:01:44.930 に答える