2010-10-24 3 views
9

HTTP PUT n'est pas entièrement inter-navigateur, Rails (j'utilise Rails 3) prend en charge l'utilisation de POST et transmet le paramètre de requête _method. C'est génial, mais cela ne semble pas fonctionner lors de l'envoi de JSON.Utilisation de HTTP PUT pour envoyer JSON avec Jquery et Rails 3

Exemple:

$.ajax({ 
    url: window.location.pathname, 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({_method:'PUT', page:{my_data: 1}), 
    dataType: 'json' 
}); 

Quand Rails voit cela, il ne reconnaît pas la override '_method' parce qu'il est passé au format JSON (peut-être que la conversion est plus tard?). Rails renvoie une erreur "No route matches ..." disant qu'il ne peut pas trouver le chemin (à la ressource), je suppose parce qu'il ne correspond pas à la mise à jour REST = HTTP PUT verbe, j'ai même essayé d'ajouter ceci à l'URL: ?_method=PUT mais a obtenu le même résultat.

La seule chose qui ne semble au travail met en en-tête HTTP:

$.ajax({ 
    url: window.location.pathname, 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({my_data: 1}), 
    dataType: 'json', 
    beforeSend: function(xhr){ 
     xhr.setRequestHeader("X-Http-Method-Override","put"); 
    } 
}); 

Le réglage du override tête HTTP la meilleure façon?

+0

Il semble que la plupart des navigateurs Web aient pris en charge directement la méthode (PUT POST DELETE pour XmlHTTPRequests), il est donc facile de dire que cela fonctionne correctement sans définir l'en-tête supplémentaire ou le paramètre '_method'. Mon erreur d'origine a été provoquée par le mélange de PUT/POST lors du routage vers les rails. Il semble que la plupart des navigateurs Web aient supporté cela (PUT POST DELETE pour XmlHTTPRequests), donc on peut dire que ça marche très bien. Mon erreur d'origine a été causée par le mélange de PUT/POST lors du routage vers les rails. –

+0

Avez-vous déjà compris pourquoi la version supérieure ne fonctionne pas? – digitalWestie

Répondre

10

AJAX soutient le verbe PUT directement alors pourquoi prendre la peine avec _method et en-têtes HTTP personnalisés:

$.ajax({ 
    url: window.location.pathname, 
    type: 'PUT', 
    contentType: 'application/json', 
    data: JSON.stringify({ page: { my_data: 1 }), 
    dataType: 'json' 
}); 

Assurez-vous également que vous respectez la same origin policy ou jquery pourrait essayer d'utiliser JSONP qui fonctionne uniquement avec GET verbes.

+0

Tous les navigateurs ne prennent pas en charge les méthodes 'PUT' et' DELETE' dans XmlHTTPRequest, mais si vous ciblez des méthodes modernes, elles vont avec. –

+0

HTTP spec décrit PUT, POST, ... AJAX est juste une collection de technologies. Bien que, vous semblez avoir raison (après avoir beaucoup regardé autour) que * la plupart * des navigateurs modernes supportent HTTP PUT. –

+0

On dirait que la plupart des navigateurs web ont supporté cela (PUT POST DELETE pour XmlHTTPRequests), donc on peut dire que ça fonctionne très bien. Mon erreur d'origine a été causée par le mélange de PUT/POST lors du routage vers les rails. –