2015-09-30 9 views
6

の設定 "アダプターは、それが無効であったため、コミット拒否" ディンゴのAPI バックエンドの検証は常に

  • フロントエンド=エンバー1.13.6、エンバーデータ1.13とバックエンド= Laravel 5.1

    • 、。 7
    • アダプタ=エンバーデータRESTAdapter

    通報

    私は最初のEmberアプリケーションでバックエンド検証エラーを処理しようとしています。

    { 
        "message":"Couldn't save client", 
        "errors":{ 
          "name":["The name field is required."], 
          "email":["The email field is required."] 
         }, 
        "status_code":422 
    } 
    

    を試しました(と失敗):

    Error: The adapter rejected the commit because it was invalid 
    at new Error (native) 
    at Error.EmberError (http://localhost:4200/assets/vendor.js:26266:21) 
    at Error.ember$data$lib$adapters$errors$$AdapterError (http://localhost:4200/assets/vendor.js:69564:50) 
    at Error.ember$data$lib$adapters$errors$$InvalidError (http://localhost:4200/assets/vendor.js:69637:52) 
    at ajaxError (http://localhost:4200/assets/frontend.js:16:24) 
    at ember$data$lib$system$adapter$$default.extend.ajax.Ember.RSVP.Promise.hash.error (http://localhost:4200/assets/vendor.js:71327:31) 
    at jQuery.Callbacks.fire (http://localhost:4200/assets/vendor.js:3350:30) 
    at Object.jQuery.Callbacks.self.fireWith [as rejectWith] (http://localhost:4200/assets/vendor.js:3462:7) 
    at done (http://localhost:4200/assets/vendor.js:9518:14) 
    at XMLHttpRequest.jQuery.ajaxTransport.options.send.callback (http://localhost:4200/assets/vendor.js:9920:8) 
    

    バックエンドからの応答が422処理不能エンティティヘッダを持っており、内容は次のとおりです。エラーがサーバーから返されたとき、私はこのエラーを取得しますRESTAdapter Oへの拡張ソリューション

    • Ember data Rest adapter error handling not working
      ajaxError機能verride、鉱山は現在、次のようになります。メソッドを保存するcatchステートメントを追加

      ajaxError: function(jqXHR) { 
      var error = this._super(jqXHR); 
      if (jqXHR && jqXHR.status === 422) { 
          var jsonErrors = Ember.$.parseJSON(jqXHR.responseText).errors; 
          return new DS.InvalidError(jsonErrors); 
      } else { 
          return error; 
      } 
      } 
      
    • 、自分の行動を救う現在:ActiveModelAdapterアウト

      save() { 
          var self = this; 
      
          function transitionToPost(post) { 
           self.transitionToRoute('clients.show', post); 
          } 
      
          function failure(reason) { 
           // handle the error 
           console.log(reason); 
           return false; 
          } 
      
          this.get('model').save().then(transitionToPost, failure).catch(failure); 
      } 
      
    • テスト - わかりません私はこれを達成することを期待していましたが、私は絶望的でした。結果は変わりませんでした。

    • エンバードキュメント(http://guides.emberjs.com/v1.13.0/models/creating-updating-and-deleting-records/#toc_promises
      あなたは上記の私のコントローラのコードで見ることができるように、私は実際にあなたが見ていると助言することができますベース

    としてこれを使用?助けをあらかじめありがとう!

  • +0

    [OK]をので、私は燃えさしデータをアンインストールし、それを再インストールしてから、すべてが正常に動作し始めた:あなたがしようとした場合、このモデルでServerErrorsMixinから延長することを忘れないでください! – AshleyVee

    答えて

    0

    マイapp/adapters/application.js

    export default DS.RESTAdapter.extend({ 
        ajaxError(jqXHR) { 
        var error, errors, jsonErrors, response; 
        error = this._super(jqXHR); 
    
        if (jqXHR && jqXHR.status === 422) { 
         response = Ember.$.parseJSON(jqXHR.responseText); 
         errors = {}; 
         if (response.errors != null) { 
         jsonErrors = response.errors; 
         Ember.keys(jsonErrors).forEach(function(key) { 
          return errors[Ember.String.camelize(key)] = jsonErrors[key]; 
         }); 
         } 
         return new DS.InvalidError(errors); 
        } else { 
         return error; 
        } 
        } 
    }); 
    

    モデルのカスタムServerErrorsMixinと組み合わせる:エンバーデータ1.0.0-beta.18

    export default Ember.Mixin.create({ 
        isntValid: Ember.computed.not('isValid').readOnly(), 
    
        adapterDidInvalidate(errors) { 
        let recordErrors = this.get('errors'), 
         hasProp = {}.hasOwnProperty; 
    
        for (let key in errors) { 
         if (!hasProp.call(errors, key)) { 
         continue; 
         } 
    
         let propertyErrors = errors[key]; 
    
         if(key === 'duplicate') { 
         if(!Ember.isArray(propertyErrors)) { 
          recordErrors 
          .get('messages') 
          .pushObject(propertyErrors); 
         } else { 
          Ember.debug('It shouldnt be an array.'); 
         } 
         } else { 
         for (let e of propertyErrors) { 
          recordErrors 
          .get(key) 
          .pushObject(e); 
         } 
         } 
        } 
    
        this._saveWasRejected(); 
        } 
    }); 
    

    作品罰金。

    import ServerErrorsMixin from '../mixins/server-errors'; 
    
    export default DS.Model.extend(ServerErrorsMixin, { 
        // ... 
    }) 
    
    +0

    説明したとおりにこれを試しましたが、私はまだ同じエラーが発生しています。それは間違いなくajaxErrorメソッドに当たっています。コンソールにはその時点でエラーが記録されていますが、mixinの "adapterDidInvalidate"には決して当てはまりません。 – AshleyVee

    関連する問題