Использование HTTP PUT для отправки JSON с Jquery и Rails 3 - PullRequest
9 голосов
/ 24 октября 2010

HTTP PUT не является полностью кросс-браузерным, поэтому Rails (я использую Rails 3) поддерживает использование POST и передачу параметра запроса _method.Это замечательно, но, похоже, не работает при отправке JSON.

Пример:

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

Когда Rails видит это, он не распознаетПереопределение '_method', потому что оно передается в формате JSON (возможно, это преобразование будет позже?).Rails возвращает ошибку «Нет подходящих маршрутов ...», говоря, что он не может найти маршрут (к ресурсу), я полагаю, потому что он не соответствует глаголу REST update = HTTP PUT, я даже пытался добавить это кURL: ?_method=PUT, но получил тот же результат.

Единственное, что делает , похоже, работает - это установка заголовка 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");
    }
});

Является ли настройка заголовка переопределения HTTP лучшим способом?

1 Ответ

10 голосов
/ 24 октября 2010

AJAX поддерживает глагол PUT напрямую, поэтому зачем использовать _method и пользовательские заголовки HTTP:

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

Также убедитесь, что вы соблюдаете политику с тем же источником или jqueryможет попытаться использовать JSONP, который работает только с GET глаголами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...