2011-10-06 12 views
7

Sto usando Backbone.js (versione 0.5.3) e sto avendo qualche problema con una callback di successo quando saving a model. Non viene eseguito, anche se il modello è stato salvato correttamente sul server.Perché viene chiamato il mio callback di errore di Backbone.js anche se Rails sta presumibilmente restituendo una risposta di successo?

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' 

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

uscita della console:

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

sto tornando head :ok dall'azione aggiornamento in Ruby on Rails.

L'aggiunta degli argomenti del modello e della risposta, in modo che sia success: (model, response) ->, non faccia differenza. Cosa sta andando storto?

MODIFICA: Come suggerito da Trevor Burnham, ho aggiunto un callback di errore ed è in esecuzione. Quindi, cosa dovrei tornare dall'azione Ruby on Rails affinché Backbone consideri il salvataggio un successo? Al momento ho head :ok

EDIT 2: Ecco il mio JavaScript aggiornato compilato:

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

Ecco la richiesta PUT:

enter image description here

+1

Cosa succede se si aggiunge anche un callback 'error'? Viene chiamato? –

+0

Grazie per il suggerimento, ho modificato la domanda. – ben

+0

Ho modificato il titolo della domanda. Potresti voler riscriverlo meglio di così:/ – hugomg

risposta

12

ho incontrato questo. Non puoi semplicemente restituire head :ok e utilizzare il comportamento predefinito di Backbone. Il Backbone.Sync predefinito non ce l'ha.

Prima di tutto, se lo stai facendo nell'azione create, non saprai mai cosa sia il tuo id così il modello non sarà in grado di aggiornarlo in seguito (cosa che stai facendo, a causa del "PUT" ").

In secondo luogo, nell'azione update, il modello non saprà che i dati sono veramente sincronizzati se si restituisce head :ok in modo che la sincronizzazione non riesca. Ma non importa se non hai un id.

In ogni caso, è necessario restituire qualcosa nel corpo.

Le impalcature delle rotaie, per impostazione predefinita, restituiscono head :ok in caso di successo update. Questo non funziona con Backbone. Per risolvere il problema, restituire il JSON invece:

render json: @entity 

(dove @entity è qualunque sia la vostra variabile è nell'azione)

+0

Funziona ora, grazie per il tuo aiuto! – ben

0

Backbone si aspetta che il JSON dal server, e il server restituisce con un testo.

Per fissare questo a lato client, impostare il tipo di dati come testo invece di JSON, e il server si aspetta tipo di contenuto come JSON.

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

Il codice aggiornato segue,

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

Il tipo di dati di testo non sarà analizzato da Backbone dopo il salvataggio.

Problemi correlati