当我的控制器操作不成功时,我将返回带有一些JSON数据的403,因此我可以包含失败的详细信息(例如ActiveRecord错误)。问题是,响应内容(如Chrome的开发人员工具中所示)似乎是空的。
即使请求的操作失败,我是否应该返回200,然后检查'ajax:success'事件处理程序中的JSON数据?这看起来有点奇怪。理想情况下,我想访问'ajax:error'处理程序中的数据。
我是API风格编程的新手,所以我不了解最佳实践。
答案 0 :(得分:3)
我不知道这是不是最佳做法,但我是这样做的:
在控制器中,如果发生错误:
render :new, :status => :bad_request
new.js.erb是原始视图,包括显示错误的表单。
JavaScript的:
$('#the_form').live('ajax:failure', function(evt, xhr, status, error) {
if (xhr.status == 400) {
alert(xhr.responseText);
} else {
alert('Generic error message');
}
});
Rails在引发异常时发送500(:internal_server_error)。这是由JavaScript中的else覆盖,但正如您所看到的,在这种情况下,您没有机会返回错误或重新呈现表单。我不得不使用不同的状态代码,因此它会呈现内容,但仍然会遇到ajax:failure事件。
这是list of status code mappings。我选择了400,因为它是最接近的匹配。