ruby-on-rails – 从Rails的JSON响应中寻找用于角色的通用错误处理的范例

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 从Rails的JSON响应中寻找用于角色的通用错误处理的范例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个作为Rails服务器应用程序架构的应用程序,为应用程序提供RESTful api. Rails服务器使用RABL.客户端是一个Angular JS客户端,执行标准的$http调用(gets,puts等).

偶尔,我的Rails服务器会产生一个错误(假设验证错误附加到对象),甚至没有错误,在这种情况下,我想要向用户显示某些东西 – 例如,“记录没有保存,因为… “或”记录更新成功“.

我试图在Rails端和角色/客户端上绘制一个模式来处理这个.

至于Rails:

>我当然可以传回每个我的RABL文件中的节点,以包含错误数组
>我也可以返回不同的RABL通过检查控制器返回之前
>大多数建议使用http代码(这是有道理的),根据here(尽管似乎没有一致的用法代码,如验证错误).

至于角度:

>我想我可以写一个response interceptor,但不知道怎么会被彻底冲洗掉.

我想我希望我不必重新发明这里,有人可以指出我目前使用和建议(和本地化)的模式.

解决方法

我继续执行了我认为需要做的事情.感谢 digger69的一些帮助.

在Rails端,我使用http状态代码.根据here,我同意使用400个http状态代码进行错误验证.

在我的控制器中,我现在有一些如下所示:

def create
  my_obj = MyObj.build_with_params(params)
  if my_obj.save
    respond_with(my_obj) # regular RABL response
  else
    respond_with_errors(my_obj.errors)
  end
end

在我的application_controller.rb中,我定义了一个常用的respond_with_errors方法

# respond back to the client an http 400 status plus the errors array
def respond_with_errors(errors)
  render :json => {:errors => errors},:status => :bad_request
end

请注意:根据here已经为Rails定义了bad_request符号:

在客户端,我需要拦截http呼叫(不仅用于验证,而且用于认证失败(也可能是更多).以下是以Angular为例的代码(感谢this post的帮助):

var interceptor = ['$rootScope','$q',function (scope,$q) {
  function success(response) {
    return response;
  }
  function error(response) {
    var status = response.status;

    if (status == 401) { // unauthorized - redirect to login again
      window.location = "/";
    } else if (status == 400) { // validation error display errors
      alert(JSON.stringify(response.data.errors)); // here really we need to format this but just showing as alert.
    } else {
      // otherwise reject other status codes
      return $q.reject(response);
    }
  }
  return function (promise) {
    return promise.then(success,error);
  }
}];
$httpProvider.responseInterceptors.push(interceptor);

我现在可以与我的rails代码一致,并处理客户端上的http呼叫的成功返回.我相信我还有更多的事情要做,但是我认为这会给出一个本地化的解决方案.

猜你在找的Ruby相关文章