Что может быть причиной 406 при идентичном.json почтовом звонке?

Я использую тяжелое приложение на основе 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

1 ответ

Решение

Мне кажется, что проблема заключается в Content-Type Resposne заголовка. Он использует 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();
  }
});

Надеюсь, это решит вашу проблему.

Другие вопросы по тегам