У меня есть страница, на которой пользователь может редактировать различные материалы с помощью кнопок и выбирать, что вызывает вызовы 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.