私は先に進み、実行する必要があると思ったことを実行しました。これについて助けてくれた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
:bad_request シンボルは、こちらのように Rails に対して既に定義されていることに注意してください。
クライアント側では、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 呼び出しからの成功の戻り値を処理できるようになりました。もっとやるべきことがあると思いますが、これでローカライズされた解決策が得られると思います。