6

現在、エラー処理が非常に貧弱な Ruby on Rails で構築されたアプリケーションを使用しています。コントローラー メソッドが ajax を介して実行され、そのメソッドが 500 (または 404 またはその他の応答) を返す場合、500.html ページがレンダリングされ、結果として AJAX 要求に返されます。明らかに、javascript はその HTML をどう処理するかを認識しておらず、Web ページは応答を待っているだけのように見えます。

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

4

4 に答える 4

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
于 2009-03-07T02:57:05.980 に答える
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 -%>

コントローラーで承認が失敗した場合、flash[:notice] 値を設定した後、:controller=>"authorization", :action=>"unauthorizedxhr" にリダイレクトします。これにより、ユーザーに送信したメッセージをカスタマイズでき、上記の render :update コードを通じてメッセージの表示を処理できました。

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

上記の cpm のアイデアを引き続き使用できますが、エラーの表示は別個の別個のコントローラー ロジックによって処理されます。これにより、メンテナンスが少し簡単になるはずです。

それが役立つことを願っています。-クリス

于 2009-03-07T16:27:12.413 に答える
1

これが私の最終的な解決策でした:

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

これは基本的に、リクエストがAJAXまたは通常のGET / POSTのどちらを経由したかに関係なく、正しい静的HTMLページに転送されます。

これは、検証などの通常のエラー処理には使用されません。未処理の例外など、本当に悪いことが発生した場合にのみ使用されます。

于 2009-03-20T20:47:23.817 に答える
0

以下のようにすることができます:

allpic.js で

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

それは私のために働いています.....

于 2011-11-18T08:07:20.240 に答える