Почему вызывается мой обратный вызов ошибки Backbone.js, хотя Rails якобы возвращает успешный ответ? - PullRequest
7 голосов
/ 06 октября 2011

Я использую Backbone.js (версия 0.5.3) и у меня возникли проблемы с успешным обратным вызовом при сохранении модели .Он не запускается, даже если модель успешно сохранена на сервере.

CoffeeScript:

console.log 'in switch_private'
console.log "private_entry attribute is currently #{@model.get('private_entry')}"
@model.save {'private_entry': true},
  success: ->
    console.log 'in success'

Скомпилированный Javascript:

console.log('in switch_private');
console.log("private_entry attribute is currently " + (this.model.get('private_entry')));
return this.model.save({
  'private_entry': true
}, {
  success: function() {
    return console.log('in success');
  }
});

Вывод на консоль:

in switch_private
private_entry attribute is currently false
XHR finished loading: "http://localhost:3000/entries/235".

Я возвращаю head :ok из действия обновления в Ruby on Rails.

Добавление аргументов модели и ответа, так что это success: (model, response) ->, не имеет значения,Что происходит не так?

РЕДАКТИРОВАТЬ: В соответствии с предложением Тревора Бернхэма, я добавил обратный вызов ошибки, и он выполняется.Итак, что я должен возвращаться из действия Ruby on Rails, чтобы Backbone считал сохранение успешным?На данный момент у меня есть head :ok

РЕДАКТИРОВАТЬ 2: Вот мой обновленный скомпилированный Javascript:

var this_view;
this_view = this;
return this.model.save({
  'private_entry': !(this.model.get('private_entry'))
}, {
  success: function(model, response) {
    return console.log('in success');
  },
    error: function(model, response) {
    return console.log('in error');
  }
});

Вот запрос PUT:

enter image description here

Ответы [ 2 ]

12 голосов
/ 06 октября 2011

Я столкнулся с этим. Вы не можете просто вернуть head :ok и использовать поведение по умолчанию Backbone. Backbone.Sync по умолчанию не будет иметь его.

Прежде всего, если вы делаете это в своем create действии, вы никогда не узнаете, каков ваш id, поэтому модель не сможет обновиться позже (что вы делаете из-за "PUT").

Во-вторых, в вашем действии update модель не будет знать, что данные действительно синхронизированы, если вы вернете head :ok, поэтому синхронизация снова не удастся. Но это не имеет значения, если у вас нет id.

В любом случае, вам нужно вернуть что-то в тело.

Rails scaffolding по умолчанию возвращает head :ok при успешном update. Это не джайв с Backbone. Чтобы исправить это, вместо этого верните JSON:

render json: @entity

(где @entity - любая ваша переменная в действии)

0 голосов
/ 23 октября 2014

Backbone ожидает JSON от сервера, и сервер возвращается с текстом.

Чтобы исправить это на стороне клиента, установите тип данных как text вместо json, и сервер ожидает тип контента как json .

options.contentType = 'application/json';
options.dataType = 'text'; 

Ваш обновленный код соответствует,

return this.model.save({'private_entry': !(this.model.get('private_entry'))}, {
     success: function(model, response) {
        return console.log('in success');
     },
     error: function(model, response) {
        return console.log('in error');
     }, 
     contentType : 'application/json',
     dataType : 'text'
});

Тип данных text не будет проанализирован Backbone после сохранения.

...