我继续执行我认为需要做的事情。感谢digger69 对此的帮助。
在 Rails 方面,我使用了 http 状态码。根据这里,我同意使用 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
请注意,已根据此处为 Rails 定义了 :bad_request 符号
在客户端,我需要拦截 http 调用(不仅用于验证,还用于身份验证失败(可能更多)。这是我在 Angular 中的代码示例(感谢这篇文章的帮助):
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 调用的成功返回。我确定我还有更多工作要做,但我认为这提供了一个本地化的解决方案。