如何在Rails中的403响应中返回内容?

时间:2010-12-22 18:43:49

标签: ruby-on-rails ajax json

当我的控制器操作不成功时,我将返回带有一些JSON数据的403,因此我可以包含失败的详细信息(例如ActiveRecord错误)。问题是,响应内容(如Chrome的开发人员工具中所示)似乎是空的。

即使请求的操作失败,我是否应该返回200,然后检查'ajax:success'事件处理程序中的JSON数据?这看起来有点奇怪。理想情况下,我想访问'ajax:error'处理程序中的数据。

我是API风格编程的新手,所以我不了解最佳实践。

1 个答案:

答案 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,因为它是最接近的匹配。