3

私は何時間もこれに取り組んできましたが、Rails バックエンドが適切なエラーを発生させたときに、Angular がエラー コールバックをトリガーしない理由がわかりません。私はAngular 1.2.0rc1を使用しています。

ドキュメントによると:

non-GET "class" actions: Resource.action([parameters], postData, [success], [error])

そして、製品の保存操作中に角度コントローラーでそれを使用しています:

$scope.saveProduct = function(product){

  if (product.id) {
    Product.update({id: product.id},{product: product}, function(data){
      console.log('handle success')


    }, function(){
      console.log('handle error')  //THIS IS NEVER OUTPUT!

    });
  } 

}

リソース定義は次のとおりです。

angular.module('sellbriteApp.resources').factory('Product', function ($resource) {
  return $resource('/api/products/:id', { id: "@id" },
    {
      'create':  { method: 'POST' },
      'index':   { method: 'GET', isArray: true },
      'show':    { method: 'GET', isArray: false },
      'update':  { method: 'PUT' },
      'destroy': { method: 'DELETE' }
    }
  );
});

これが私のレールコントローラーです:

def update
  respond_to do |format|
    if @product.update(product_params)
      format.html { redirect_to [:edit, @product], notice: 'Product was successfully updated.' }
      format.json { render 'products/show.json.jbuilder', status: :accepted }
    else
      format.html { render action: 'edit' }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end
end

重複する SKU を含む製品を保存しようとすると、Rails が 422 ステータスを返します。フロント エンドにエラー メッセージを表示したいと考えています。

angular が update 呼び出しで提供されるエラー処理関数を実行することを期待していますが、そこまで到達できません。代わりに、コンソールに次のように表示されます。

TypeError: Cannot read property 'data' of undefined役に立たないスタックトレースで:

TypeError: Cannot read property 'data' of undefined
at $http.then.value.$resolved (http://localhost:9000/bower_components/angular-resource/angular-resource.js:477:32)
at wrappedCallback (http://localhost:9000/bower_components/angular/angular.js:9042:59)
at wrappedCallback (http://localhost:9000/bower_components/angular/angular.js:9042:59)
at http://localhost:9000/bower_components/angular/angular.js:9128:26
at Object.Scope.$eval (http://localhost:9000/bower_components/angular/angular.js:9953:28)
at Object.Scope.$digest (http://localhost:9000/bower_components/angular/angular.js:9809:23)
at Object.$delegate.__proto__.$digest (<anonymous>:844:31)
at Object.Scope.$apply (http://localhost:9000/bower_components/angular/angular.js:10039:24)
at Object.$delegate.__proto__.$apply (<anonymous>:855:30)
at done (http://localhost:9000/bower_components/angular/angular.js:6542:45)

私は何が欠けていますか?

アップデート:

どうやら、この http インターセプターが関連しているようです。このコードをコメントアウトすると、エラー関数が呼び出されます。このスニペットを他の場所からコピーし、ユーザーがログインしていないときに Rails API にヒットした場合にサインアップ ページにリダイレクトするように変更しました。干渉しているに違いありませんが、どのように修正すればよいかわかりませんそれ。

App.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.responseInterceptors.push('securityInterceptor');
}]);

App.factory('securityInterceptor', ['$injector', '$location', '$cookieStore', function ($injector,$location,$cookieStore) {

  return function(promise) {
    var $http = $injector.get('$http');
    return promise.then(null, function(response){
      if (response.status === 401) {
        $cookieStore.remove('_angular_devise_merchant');
        toastr.warning('You are logged out');
        $location.path('/sign_in');
      } 
    });
  };


}]);
4

1 に答える 1

7

インターセプターでも約束を拒否する必要があります。そうしないと、例外を「処理」したと見なされます。

そう:

App.factory('securityInterceptor', ['$injector', '$location', '$cookieStore', '$q', function ($injector,$location,$cookieStore, $q) {

  return function(promise) {
    var $http = $injector.get('$http');
    return promise.then(null, function(response){
      if (response.status === 401) {
        $cookieStore.remove('_angular_devise_merchant');
        toastr.warning('You are logged out');
        $location.path('/sign_in');
      }
      return $q.reject(response);
    });
  };


}]);
于 2013-09-20T05:07:15.417 に答える