【问题标题】:Redirecting to a 500 page when an AJAX call fails in Ruby on Rails在 Ruby on Rails 中 AJAX 调用失败时重定向到 500 页
【发布时间】:2009-03-06 19:24:55
【问题描述】:

我正在使用一个在 Ruby on Rails 中构建的应用程序,目前的错误处理能力非常差。如果通过 ajax 执行控制器方法,并且该方法导致 500(或 404 或任何其他响应),则 500.html 页面将被呈现并作为 AJAX 请求的结果返回。显然,javascript 不知道如何处理该 HTML,并且网页看起来只是在等待响应。

在 AJAX 调用期间发生错误时,rails 中是否有一种简单的方法来呈现 error.rjs 模板?

【问题讨论】:

    标签: ruby-on-rails ruby ajax rjs


    【解决方案1】:

    您可以在控制器的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
    

    【讨论】:

      【解决方案2】:

      我用授权解决了一个类似的问题。我用这个动作创建了一个简单的授权控制器:

        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 的想法,但错误的显示将由单独且不同的控制器逻辑处理。这应该使它更容易维护。

      希望对您有所帮助。 -克里斯

      【讨论】:

        【解决方案3】:

        这是我的最终解决方案:

        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 页面。

        这不用于正常的错误处理,例如验证等。它仅在发生非常糟糕的事情时使用 - 例如未处理的异常。

        【讨论】:

          【解决方案4】:

          你可以像下面这样:

          在 allpication.js 中

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

          它对我有用.....

          【讨论】:

            猜你喜欢
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-28
            相关资源
            最近更新 更多