1

ドラッグアンドドロップ機能を使用する重いJavaScriptベースのアプリを使用しています。

それはうまくいきます。しかし、動的オブジェクト(他のオブジェクトとまったく同じ属性と変数を持つ)をページに追加すると、ドラッグされますが、ドロップすると、POSTは406を返します。

この呼び出しが行われる前に必要になる可能性のある環境リスナーを再インスタンス化するため、ここで何が起こっているのか完全にはわかりません。私はこれへの呼び出しを分解しました:

.cranbar動作している既存のオブジェクトはどこにありますか。動的に追加されたものと同じものに切り替えると.foobar、406が返されます。

attrs = { _method:"put"};
box = $(".cranbar");
$.post(box.attr('data-update_path'), attrs, function(data) {
});

このスニペットはmake_droppable、オブジェクトがインスタンス化された後、ドラッグアンドドロップを試みる前にロードされるメソッドからのものです。

make_droppable: function(){
  $('table#week .day').droppable({
    accept: '.job, .task',
    hoverClass: 'droppable-hover',
    drop: function(e, ui) {
      if (confirmOnDrop){
        if (!confirm('Are you sure?')) {
          if ($('table#week').length > 0) {
            draw_weekly_calendar();
          }
          return false;
        }
      }

      var box = $(ui.draggable);
      // var old_container = box.parents('td:first');
      var new_cell = $(this);
      var new_container = $(this).find('.rel_box');

      // add indicator
      box.addClass('indicator');

      // add box to new container
      box.attr('style', 'position: absolute;').appendTo(new_container);

      var attrs = null;

      if (box.attr('data-object-type') == 'job') {
        // update job already on screen
        attrs = {
          'job[scheduled_on]': new_cell.attr('data-scheduled_on'),
          '_method': 'put'
        }
      }
      else if  (box.attr('data-object-type') == 'task') {
        attrs = {
          'task[scheduled_at]': new_cell.attr('data-scheduled_on'),
          '_method': 'put'
        }
      }

      if (attrs) {
        $.v = attrs;
        $.post(box.attr('data-update_path'), attrs, function(data) {
          box.removeClass('indicator');
          box.attr('data-scheduled_at', new_cell.attr('data-scheduled_on'));
          draw_weekly_calendar();
        });
      }

      // nice effect
      box.effect('shake', { times: 1, distance: 2 }, 50);
    }
  });      
},

この406のソースを見つけるために私ができることを誰かが知っていますか?

アップデート

これはおそらくそれと多くの関係があります。しかし、私は今ヘッダーを比較しています。

失敗した投稿:

Response Headers
Cache-Control   no-cache
Connection  Keep-Alive
Content-Length  1
Content-Type    text/html; charset=utf-8
Date    Mon, 09 Jul 2012 16:11:27 GMT
Server  WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)

Request Headers
Accept  text/javascript
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.8,es-es;q=0.5,es;q=0.3
Connection  keep-alive
Content-Length  57
Content-Type    application/x-www-form-urlencoded; charset=UTF-8

成功した投稿:

Response Headers
Cache-Control   max-age=0, private, must-revalidate
Connection  Keep-Alive
Content-Length  2024
Content-Type    application/json; charset=utf-8
Date    Mon, 09 Jul 2012 16:11:35 GMT
Etag    "93432c11e3cc55dfec8e0aee7c08bcc1"
Server  WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)

Request Headers
Accept  text/javascript
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.8,es-es;q=0.5,es;q=0.3
Connection  keep-alive
Content-Length  57
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
4

1 に答える 1

2

問題はContent-Typeresposneヘッダーにあるようです。を使用していますtext/htmlが、期待していapplication/jsonます。contentTypeこれにより 406 エラーが発生します。これは、データは正常にクエリされましたが、有効な応答ではないためです -> 406. $.post パラメータで withを変更できるかどうかは正直わかりませんが、 .ajax().

$.ajax({ 
  type: 'POST', 
  url: box.attr('data-update_path'), 
  contentType: 'application/json; charset=utf-8', 
  data: attrs,
  success: function(data){ 
    box.removeClass('indicator');
    box.attr('data-scheduled_at', new_cell.attr('data-scheduled_on'));
    draw_weekly_calendar();
  }
});

うまくいけば、これで問題が解決します。

于 2012-07-09T16:34:09.937 に答える