我正在构建一个作为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呼叫的成功返回.我相信我还有更多的事情要做,但是我认为这会给出一个本地化的解决方案.