0

Railsコントローラーにデータを送信しているJavaScriptにajaxリクエストがあります。コントローラは、データがすでにデータベースにある情報と重複していることを検出すると、「処理不能エンティティ」エラーを返します。

ダイアログを開いて、重複した情報を挿入してもよいかどうかをユーザーに尋ねたいと思います。ユーザーが「はい」と答えた場合は、データオブジェクトに別のキーを追加して、リクエストを再試行します。追加されるキーは、重複チェックを無視し、とにかくデータを挿入するフラグになります。

$.ajax({
      url: '/url',
      type: 'post',
      data: this.buildData(),
      success: function() {
        bootbox.alert('Information added', function() {
            Backbone.history.loadUrl();
          }.bind(this)
        );
      }.bind(this),
      error: function(jqXHR, textStatus, errorThrown) {
        if(errorThrown === 'Unprocessable Entity') {
          bootbox.confirm('Do it anyway?', function(confirm) {
              if(confirm) {
                /*Here I want to add another key to the data object and resend the request*/ 
              }
             }.bind(this)
           );
         }  
       }.bind(this)
    });

私はこれをどのように行うのでしょうか、あるいはもっと良いことに、私が達成しようとしていることを行うためのより良い方法はありますか?

4

1 に答える 1

0

まず第一に、私はそのためのプラグインがあると確信しています。

しかし、適切なプラグインがない場合は、いつでもこのようなことを行うことができます

function dispatchAjax( options ){

     options = $.extend({},options);
     var data = $.extend({}, this.buildData(), options.data );
     $.ajax({ ... , 
                  error : function( ) { .... 
                             if ( typeof(options.retry) == "function" ){
                                   var retryFunc = options.retry;
                                   options.retry = null;
                                   options.data = { "extraKey":"extraValue"};
                                   dispatchAjax( options );
                             }
             });

}

これが正しく実行されることを確認し、完全なコードを提供するために少し時間をください

興味があるかもしれない別の方法は、同期呼び出しを使用することです。{"async":false}JQueryのajaxリクエストで。

これは目的を損なうように見えるかもしれませんが、サーバー側の検証には非常に役立つことがわかりました。したがって、ニーズに合っている可能性があり、上記のように複雑なハンドラーを処理する必要はありません。単純に次のようになります。 :

  var result = dipatchRequest( options, /*async*/  false, /*ignore-duplicates*/ false );
  if ( result.error && confirm(..) ){ 
       dispatchRequest(options, true, true);
  } 
于 2012-08-27T20:36:33.110 に答える