woshidan's blog

あいとゆうきとITと、とっておきの話。

サーバからのレスポンスのHTTPステータスコードは200のはずなのにAngularJSの$httpの.errorコールバックが呼び出される

Jqueryのバージョンは1.9, AngularJSのバージョンはv1.2.12。

詰んだ点

Railsでは

render :status => 600
などのようにHTTPステータスコードを制御できる。
だから、

Rails

def update
  render :status => 200
end

と書いておけば

angularJS側

$http({ method: 'PATCH', url: '/books/'+id, data: data })
   .success(function(data, status) {
       /* some process */
    })
   .error(function(data, status)) {
       /* some process */
   };

このangularJSのコードのように$httpメソッドでupdateアクションのurlへのリクエストを送ったら、
.successが呼び出されると考えていたのだが、
.errorが呼び出されていて、.error内でリクエストステータスコードをconsole.logなどで出力してみても
200なので困った。

 

解決策

def update
  # render :status => 200
  render :json => { :status => 200 }, :status => 200
end

どうやらAngularJSはJSONの中で:statusを探しているみたいなのでJSONの中にきちんと:statusのキーを含めてあげる必要があるようです。