2011-10-06 8 views
7

Używam Backbone.js (wersja 0.5.3) i mam pewne problemy z powodzeniem oddzwonić, gdy saving a model. Nie jest uruchamiany, mimo że model został pomyślnie zapisany na serwerze.Dlaczego wywoływana jest funkcja wywołania zwrotnego błędu Backbone.js, mimo że Rails rzekomo zwraca odpowiedź powodzenia?

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' 

Zestawione 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'); 
    } 
}); 

wyjście konsoli:

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

Wracam head :ok z działaniem aktualizacja w Ruby on Rails.

Dodanie argumentu modelu i odpowiedzi, aby było success: (model, response) ->, nie ma znaczenia. Co idzie źle?

EDYTOWANIE: Zgodnie z sugestią Trevora Burnhama, dodałem błąd zwrotny i jest uruchamiany. Więc co powinienem wracać z działania Ruby on Rails, aby Backbone mógł pomyśleć o sukcesie? W tej chwili mam head :ok

EDIT 2: Tu jest mój zaktualizowany skompilowane 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'); 
    } 
}); 

Oto żądanie PUT:

enter image description here

+1

Co jeśli dodasz również wywołanie "błąd"? Czy to się nazywa? –

+0

Dzięki za sugestię, zredagowałem pytanie. – ben

+0

Edytowałem tytuł pytania. Możesz napisać coś jeszcze lepiej:/ – hugomg

Odpowiedz

12

Zabrakło mi do tego. Nie możesz po prostu zwrócić head :ok i użyć domyślnego zachowania Backbone. Domyślny Backbone.Sync go nie ma.

Przede wszystkim, jeśli robisz to w swoim działaniu create, nie będzie nigdy wiesz co id jest więc model nie będzie w stanie zaktualizować później (co robisz, z powodu „PUT ").

Po drugie, w działaniu update model nie będzie wiedział, że dane są naprawdę zsynchronizowane, jeśli zwrócisz head :ok, więc synchronizacja znowu się nie powiedzie. Ale nie ma znaczenia, jeśli nie masz id.

Niezależnie od przypadku, musisz zwrócić coś w ciele.

Rusztowanie szynowe domyślnie zwraca head :ok po pomyślnym wykonaniu update. To nie jive z kręgosłupem. Aby to naprawić, wrócić JSON zamiast:

render json: @entity 

(gdzie @entity jest niezależnie zmienna jest w akcji)

+0

Teraz działa, dziękuję za pomoc! – ben

0

Backbone spodziewa JSON z serwera, a serwer powraca z tekstem.

Aby rozwiązać ten problem po stronie klienta, należy ustawić typ danych jako tekstu zamiast json, a serwer spodziewa typ zawartości jako json.

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

Kod Aktualizacja następuje,

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' 
}); 

Typ danych tekst nie będzie analizowany przez Backbone po uratować.