2009-03-06 35 views
6

Ruby on Railsで構築されたアプリケーションで、エラー処理が非常に貧弱です。コントローラメソッドがajax経由で実行され、そのメソッドが500(または404またはその他の応答)になると、500.htmlページがレンダリングされ、結果としてAJAXリクエストに返されます。明らかにjavascriptはそのHTMLをどうしたらいいのか分からず、ウェブページはちょうどレスポンスを待っているように見えます。Ruby on RailsでAJAX呼び出しが失敗したときに500ページにリダイレクト

AJAX呼び出し中にエラーが発生すると、error.rjsテンプレートをレンダリングする簡単な方法がありますか?

答えて

3

コントローラのrescue_actionまたはrescue_action_in_publicメソッド内でrespond_toを使用できます。以下のコントローラを考えてみましょう。

class DefaultController < ApplicationController 

    def index 
    raise "FAIL" 
    end 

    def rescue_action(exception) 
    respond_to do |format| 
     format.html { render :text => "Rescued HTML" } 
     format.js { render :action => "errors" } 
    end 
    end 
end 
3

私は同様の問題を認可で解決しました。私はこのアクションで簡単な認証コントローラを作成:

def unauthorizedxhr 
    render :update do |page| 
     page.replace_html("notice", :partial=>"unauthorizedxhr") 
     page.show("notice")  
    end 
    end 

ここではテンプレートです:

<% if flash[:notice] -%> 
    <div id="noticexhr"><%= flash[:notice] %></div> 
<% end -%> 

承認がコントローラに障害が発生したとき、私はにリダイレクトしたい:コントローラ=>「承認」、 :action => "unauthorizedxhr"にフラッシュ[:notice]値を設定してください。これにより、ユーザーに送信したメッセージをカスタマイズすることができ、上記のrender:updateコードを使ってメッセージの表示を処理しました。

エラーコントローラーを作成し、他のコントローラーで発生したエラーをキャッチして、単にコントローラー=> "エラー"、アクション=> "displayxhr"にリダイレクトすることで、これを問題に適応させることができます。そうすれば、エラー通信メカニズムを標準化することができますが、各アクションごとにエラーメッセージをカスタマイズすることができます。

上記のcpmの考え方は引き続き使用できますが、エラーの表示は別個のコントローラロジックで処理されます。それは維持するのが少し容易になるはずです。

希望に役立ちます。

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
    format.html { render_optional_error_file response_code} 
    format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
    end 
end 

この基本的に転送し、正しい静的なHTMLページへのリクエストがAJAXまたは通常のGET/POSTによるものであればどんなに: -Chris

1

これは私の最終的な解決策でした。

これは、検証などの通常のエラー処理には使用されません。これは、処理されない例外のような、実際に何かが起こったときにのみ使用されます。

0

あなたは以下のように行うことができます。

をallpication.js

$(document).ready(function(){ 
    $(document).ajaxError(function(e, xhr, options){ 
    if("500" == xhr.status) 
    { 
     $(location).attr('href','/users/sign_in'); 
    } 
    }); 
}) 

その中で私のために働い.....

関連する問題