我正在使用一个在 Ruby on Rails 中构建的应用程序,现在的错误处理非常差。如果通过 ajax 执行控制器方法,并且该方法导致 500(或 404 或任何其他响应),则 500.html 页面将被呈现并作为 AJAX 请求的结果返回。显然,javascript 不知道如何处理该 HTML,并且网页看起来只是在等待响应。
在 AJAX 调用期间发生错误时,rails 中是否有一种简单的方法来呈现 error.rjs 模板?
我正在使用一个在 Ruby on Rails 中构建的应用程序,现在的错误处理非常差。如果通过 ajax 执行控制器方法,并且该方法导致 500(或 404 或任何其他响应),则 500.html 页面将被呈现并作为 AJAX 请求的结果返回。显然,javascript 不知道如何处理该 HTML,并且网页看起来只是在等待响应。
在 AJAX 调用期间发生错误时,rails 中是否有一种简单的方法来呈现 error.rjs 模板?
您可以在控制器的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
我通过授权解决了类似的问题。我用这个动作创建了一个简单的授权控制器:
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 的想法,但错误的显示将由单独且不同的控制器逻辑处理。这应该使它更容易维护。
希望有帮助。-克里斯
这是我的最终解决方案:
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 页面。
这不用于正常的错误处理,如验证等。它仅在发生非常糟糕的事情时使用 - 例如未处理的异常。
你可以像下面这样:
在 allpication.js 中
$(document).ready(function(){
$(document).ajaxError( function(e, xhr, options){
if("500" == xhr.status)
{
$(location).attr('href','/users/sign_in');
}
});
})
它为我工作......