Как получить хороший ответ от сохранения модели

С backbone.js Я сохраняю модель. PUT отправляется на сервер, и ответ возвращается. В первый раз, когда я это делаю, он возвращает успех, следующие ошибки возвращаются, потому что после первого ответа ответ добавляется в модель.

Сохранить функцию в Backbone.js:

saveCountry: function() {
    this.model.save({},{
        success: function(model, response) {
            console.log('success! ' + response);
        },
        error: function(model, response) {
            console.log('error! ' + response);
        }
    });
    this.render();

    return false;
},

PHP возвращает строку JSON:

{"response": "Model saved!"}

После PUT получите ошибку в качестве ответа, потому что к модели добавляется "ответ":

Unknown column 'response' in 'field list'

Почему ответ добавлен в модель и как ее предотвратить?

Ответ 1

Из справочной документации по модели save:

Установить хэш атрибутов модели и синхронизировать модель с сервером. Если сервер возвращает хэш атрибутов, который отличается, состояние модели будет снова установлен. http://documentcloud.github.com/backbone/docs/backbone.html#section-41

Что нужно сделать, чтобы заставить его работать: не возвращайте {server] с сервера. Просто верните успех (статус 200) без содержимого.

Если сохранение не сработало, верните JSON с ошибками, а Backbone вызовет событие ошибки на вашей модели с предоставленным JSON (см. http://documentcloud.github.com/backbone/docs/backbone.html#section-41 и http://documentcloud.github.com/backbone/docs/backbone.html#section-145).

Ответ 2

Просто чтобы воскресить древнюю нить...

Не всегда возможно/желательно изменить ответ, который вы возвращаете с сервера.

Другим решением является переопределение parse в модели, чтобы позаботиться об этом. Для вашей ситуации, когда ответ не подходит для ВСЕХ ваших моделей, вы можете сделать это в суперклассе.

MyModel = Backbone.Model.extend({
    parse: function(data) {
        delete data["success"];
        return data;
    }
});

Address = MyModel.extend({
    saveCountry: function() {
        this.model.save({},{
            success: function(model, response) {
                console.log('success! ' + response);
            },
            error: function(model, response) {
                console.log('error! ' + response);
            }
        });
        this.render();

        return false;
    },

    ...

});