2012-05-06 11 views
3

私はレールが新しく、私は一日中答えを探していました。控えめなことは懇願から始まる。ajaxリクエストをキャンセルすると、レールに例外がスローされます

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 /検索/ {クエリ}」私の場合にはウィッヒをレールに行くには、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 

私はすぐに私たちはもはやそれを必要としないとして意味をなさないキャンセルされ、レールへの自動入力補完からのすべてが、最後の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 

は、さらにそれが見えます。

マイQは、以下のとおりです。

  1. 我々はクライアントからの接続は/がキャンセルされた失敗したレールに検出することができますどのように?
  2. 私たちが#1について知ったら、Net :: HTTPによるリクエストをどのように取り消すことができますか?

私はbegin - > rescue - > end blockを少なくともスカッシュ例外にしようとしましたが、それは助けになりませんでした。

答えて

1

トレースを見ると、エラーがNet :: HTTP内で発生していないため、rescueの試行が失敗しました。 webrickがラック応答をブラウザに書き戻そうとすると、エラーがスローされます。

ウェブサーバーにmongrel,thinまたはunicornをインストールすると、問題が解決する場合があります。 WebrickはRubyに組み込まれていますが、Not Robustとして知られています。

関連する問題