2010-03-16 7 views
11

Tengo una página donde el usuario puede editar varios contenidos usando botones y selecciona que active las llamadas ajax. En particular, una acción hace que una url se llame de forma remota, con algunos datos y una solicitud 'put', que (ya que estoy utilizando un backend restful carriles) desencadena mi acción de actualización. También tengo un botón de eliminar que llama a la misma URL pero con una solicitud de 'eliminar'. La llamada 'update' ajax funciona en todos los navegadores pero la 'borrar' no funciona en IE. Tengo un vago recuerdo de haber encontrado algo así antes ... ¿alguien puede arrojar algo de luz? Aquí está mi llamadas ajax:Problema con jQuery.ajax con el método 'eliminar' en, por ejemplo,

//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); 
     } 
    });  
    } 

pongo la alerta en el éxito y el error en el Ajax de borrado sólo para ver lo que ocurre, y la parte de 'error' de la llamada AJAX se dispara, pero sin llamar están realizando para EL FINAL DE LA PARTE POSTERIOR (lo sé viendo los registros de mi servidor back-end). Por lo tanto, falla antes incluso de realizar la llamada. No puedo entender por qué: el 'mensaje' que recibí del bloque de error está en blanco.

¿Alguna idea a alguien? ¿Es este un problema conocido? Lo he probado en ie6 y ie8 y tampoco funciona.

gracias - max

EDIT - la solución - gracias a Nick Craver para mí apuntando en la dirección correcta. Los rieles (y tal vez otros marcos?) Tienen un subterfugio para las solicitudes de envío y eliminación no admitidas: una solicitud posterior con el parámetro "_method" (observe el subrayado) establecido en "poner" o "eliminar" se tratará como si el tipo de solicitud real fue esa cadena. Por lo tanto, en mi caso, he hecho este cambio - en cuenta la opción de 'datos' ':

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); 
     } 
    });  
    } 

rieles ahora trataremos esto como si se tratara de una solicitud de eliminación, la preservación del sistema REST. La razón por la que funcionó mi ejemplo PUT fue porque en este caso particular, IE estaba feliz de enviar una solicitud PUT, pero oficialmente no los admite, por lo que es mejor hacer esto para las solicitudes PUT y para las solicitudes DELETE.

+1

puede usted por favor añadir la versión de IE en su etiqueta pregunta –

+0

gracias !!!!!!!!! –

+0

esto no funcionó para mí, da un GET 404, ¿esto es porque tengo dataType: 'script'? Cuando elimino "dataType: 'script'", funciona muy bien en Chrome, pero deja de funcionar en IE9, ¿alguna sugerencia? – KG2289

Respuesta

8

Tome un vistazo a su atributo de tipo type:'delete'

jQuery documentation on type:

El tipo de petición que hacer ("POST" o "GET"), por defecto es "GET". Nota: Otros métodos de solicitud HTTP, como PUT y DELETE, también se pueden usar aquí, pero no son compatibles con todos los navegadores.

En vez de ello tratar de incluir esto con sus datos y buscar la información en el lado del servidor, así:

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

ah. cojones. gracias nickCreo que un replanteamiento está en orden, lo que significa romper mi encantador esquema de descanso. :(grrrr. ¿Alguien más sabe alguna forma mágica de evitar esto? –

+0

Umm ¿incluso verificaste que IE no admite eliminar como método de solicitud http? AFAIK el objeto IE XHR también es compatible con la eliminación, pero es posible que tengas que cambiar 'type: 'delete'' to' type:' DELETE'' – jitter

+0

@jitter - No está aquí, solo probado en IE8, pero lo mismo funciona en todos los otros navegadores, tratando de encontrar las notas de desarrollo de jQuery que figuran en la lista navegadores ... había una lista completa en un punto. –

13

IE 7 y 8 no apoyar eliminar y colocar métodos. Tuve un problema donde IE7,8 no seguiría un redireccionamiento 302 e IE usaría el método DELETE o PUT para la ubicación a la que se suponía redirigir (con un get)

Para asegurarse de que IE7 y 8 funcionan adecuadamente, me gustaría utilizar un POST con los parámetros:

data: {'_method': 'delete'} 
Cuestiones relacionadas