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. 这会导致 406 错误,因为虽然数据已成功查询,但它不是有效的响应 -> 406。老实说,我不知道您是否可以更改contentType$.post 参数中的 ,但您可以使用.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 回答