6

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

在 AJAX 调用期间发生错误时,rails 中是否有一种简单的方法来呈现 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

你可以像下面这样:

在 allpication.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 回答