Ошибка сообщения Backbone.js 500

Кто-нибудь знает, как указать ContentType сообщения для json/application? Я думал, что знаю, и магистраль делает это по умолчанию, но, судя по тому, что он говорит, что получает обычный текст (см. комментарии) , я думаю, мне нужно найти другой способ указать это.

Я использую Backbone.js и пытаюсь выполнить POST в TastyPie API, который больше не доступен только для чтения, и я получаю ошибку 500, когда пытаюсь создать модель и .save() ее. Это фрагмент кода, который я использую для своей синхронизации, который я нашел здесь: http://documentcloud.github.com/backbone/docs/backbone.html#section-124

   Backbone.sync = function(method, model, options){
        var type = methodMap[method];
        var params = _.extend({
        type: type,
        dataType: 'json'
        }, options);

        if (!params.url){
        params.url = getUrl(model) || urlError();
        }

        if (Backbone.emulateJSON){
        params.contentType = 'application/json';
        params.data = params.data ? {model: params.data} : {};
        }

        if (Backbone.emulateHTTP){
        if(type === 'PUT' || type === 'DELETE'){
           if (Backbone.emulateJSON) params.data._method = type;
           params.type = 'POST';
           params.beforeSend = function (xhr){
               xhr.setRequestHeader('X-HTTP-Method-Override', type);
            };
         }
         }

        if (params.type !== 'GET' && ! Backbone.emulateJSON){
        params.prorcessData = false;
        }

        return $.ajax(params);
        };





    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
            o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
        });
        return o;
    };

    $(function() {
        $('form').submit(function() {
        var dict = $('form').serializeObject();
        var new_task = new Backbone.Model({
        date: toString(dict.date),
        name: toString(dict.name),
        priority: toString(dict.priority)});
        console.log("new_task =" + new_task);
         new_task.save();
        console.log(dict);

        return false;
        });

    });


    });

person user784756    schedule 15.01.2012    source источник
comment
это обычный backbone.sync, верно? какой 500 ответ вы получаете? Недавно я сделал приложение, сочетающее вкусный пирог с магистралью. вы можете проверить это здесь: github.com/c4urself/ratebeer, возможно, это даст вам некоторые идеи .   -  person c4urself    schedule 15.01.2012
comment
: формат, указанный как «текстовый/обычный», не имел доступного метода десериализации. Пожалуйста, проверьте свои formats и content_types в сериализаторе.,   -  person user784756    schedule 15.01.2012
comment
Одним из препятствий здесь является то, что, хотя решение Пола правильное, Tastypie еще не поддерживает заголовки X-HTTP-Method-Override. Вы можете использовать что-то вроде этого, чтобы добавить или напрямую расширить класс Resource, который вы используете, с помощью переопределенного метода: gist. github.com/2161338   -  person Ben Regenspan    schedule 22.03.2012


Ответы (1)


Попробуйте установить Backbone.emulateJSON = true; в коде.

Если для этого установлено значение true, то оно устанавливает contentType в «application/json», что вы ищете.

Вам нужно установить эту переменную только один раз, поэтому хорошее место — прямо над кодом отправки формы.

$(function() {
    Backbone.emulateJSON = true;
    $('form').submit(function() {
        ...
person Paul    schedule 15.01.2012