Проблема с jQuery.ajax с методом 'delete', т.е.

У меня есть страница, на которой пользователь может редактировать различные материалы с помощью кнопок и выбирать, что вызывает вызовы ajax. В частности, одно действие приводит к тому, что URL-адрес должен называться удаленно, с некоторыми данными и запросом "put", который (поскольку я использую backend backend) запускает мое действие обновления. У меня также есть кнопка удаления, которая вызывает тот же URL-адрес, но с запросом "удалить". "Ajax" "update" работает во всех браузерах, но "delete" не работает в IE. У меня есть смутное воспоминание о том, что я встречаю нечто подобное раньше... может ли кто-нибудь пролить свет? здесь мои ajax звонки:

//update action - works in all browsers
jQuery.ajax({
  async:true, 
  data:data, 
  dataType:'script', 
  type:'put', 
  url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId,
  success: function(msg){ 
    initializeQuizQuestions();
    setPublishButtonStatus();
  }
});  



//delete action - fails in ie
  function deleteQuizQuestion(quizQuestionId, quizId){
    //send ajax call to back end to change the difficulty of the quiz question
    //back end will then refresh the relevant parts of the page (progress bars, flashes, quiz status)
    jQuery.ajax({
      async:true, 
      dataType:'script', 
      type:'delete', 
      url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId,
      success: function(msg){ 
        alert("success");
        initializeQuizQuestions();
        setSelectStatus(quizQuestionId, true);
        jQuery("tr[id*='quiz_question_"+quizQuestionId+"']").removeClass('selected');        
      },
      error: function(msg){
        alert("error:" + msg);
      }
    });     
  }

Я положил предупреждения в успех и ошибку в delete ajax, чтобы увидеть, что произойдет, и вызвана "ошибка" части вызова ajax, но НЕ ЗВОНОК, КОТОРЫЙ СДЕЛАЛСЯ НА НАЗАД КОНЕЦ (я знаю это, наблюдая журналы моего заднего сервера). Таким образом, он терпит неудачу, прежде чем он даже сделает вызов. Я не могу понять, почему: "msg" я возвращаюсь из блока ошибок пустым.

Какие-нибудь идеи? Это известная проблема? Я тестировал его в ie6 и ie8, и он тоже не работает.

спасибо - max

EDIT - решение - благодаря Нику Крейверу, указывая мне в правильном направлении.

Rails (и, возможно, другие фреймворки?) имеет уловку для неподдерживаемых запросов на отправку и удаление: почтовый запрос с параметром "_method" (обратите внимание на подчеркивание), установленным на "put" или "delete", будет обрабатываться так, как будто фактическим типом запроса была эта строка. Итак, в моем случае я сделал это изменение - обратите внимание на параметр "data":

   jQuery.ajax({
      async:true, 
      data: {"_method":"delete"},
      dataType:'script', 
      type:'post', 
      url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId,
      success: function(msg){ 
        alert("success");
        initializeQuizQuestions();
        setSelectStatus(quizQuestionId, true);
        jQuery("tr[id*='quiz_question_"+quizQuestionId+"']").removeClass('selected');        
      },
      error: function(msg){
        alert("error:" + msg);
      }
    });     
  }

Rails теперь будет рассматривать это как запрос удаления, сохраняя систему REST. Причина, по которой мой пример PUT работал только потому, что в этом конкретном случае IE был рад отправить запрос PUT, но он официально не поддерживает их, поэтому лучше всего делать это для запросов PUT, а также для запросов DELETE.

Ответ 1

Посмотрите на свой атрибут type type:'delete'

Документация jQuery по типу:

Тип запроса ( "POST" или "GET" ), по умолчанию - "GET". Примечание. Другие методы запросов HTTP, такие как PUT и DELETE, также могут использоваться здесь, но они не поддерживаются всеми браузерами.

Вместо этого я попытался бы включить это с вашими данными и искать его на стороне сервера, например:

data: {'action': 'delete'},

Ответ 2

IE 7 и 8 не поддерживают методы DELETE и PUT. У меня возникла проблема, когда IE7.8 не будет следовать перенаправлению 302, и IE будет использовать метод DELETE или PUT для местоположения, которое он должен был перенаправить (с помощью get.)

Чтобы обеспечить правильную работу IE7 и 8, я бы использовал POST с параметрами:

data: {'_method': 'delete'}