2011-10-06 9 views
7

Estoy usando Backbone.js (versión 0.5.3) y estoy teniendo problemas con una devolución de llamada exitosa cuando saving a model. No se está ejecutando, aunque el modelo se haya guardado correctamente en el servidor.¿Por qué se llama a mi backbone de Backbone.js aunque supuestamente Rails está respondiendo con éxito?

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' 

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

salida de la consola:

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

estoy regresando head :ok de la acción de actualización en Ruby on Rails.

Agregar el modelo y los argumentos de respuesta, para que sea success: (model, response) ->, no hace la diferencia. ¿Qué está pasando mal?

EDIT: Según la sugerencia de Trevor Burnham, agregué una devolución de llamada de error, y se está ejecutando. Entonces, ¿qué debería estar volviendo de la acción de Ruby on Rails para que Backbone considere el guardar como un éxito? Por el momento tengo head :ok

EDIT 2: Aquí está mi Javascript actualizado compilado:

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

Aquí está la solicitud PUT:

enter image description here

+1

¿Qué sucede si agrega una devolución de llamada de 'error' también? ¿Se llama? –

+0

Gracias por la sugerencia, he editado la pregunta. – ben

+0

Edité el título de la pregunta. Es posible que desee volver a escribirlo mejor que eso:/ – hugomg

Respuesta

12

me he encontrado esto. No puede simplemente devolver head :ok y usar el comportamiento predeterminado de Backbone. El Backbone.Sync predeterminado no lo tendrá.

En primer lugar, si lo hace en su acción create, nunca sabrá cuál es su id para que el modelo no pueda actualizar más tarde (lo que está haciendo, debido a la "PUT" ").

En segundo lugar, en su acción update, el modelo no sabrá que los datos están realmente sincronizados si devuelve head :ok para que la sincronización vuelva a fallar. Pero no importa si no tiene un id.

En cualquier caso, debe devolver algo en el cuerpo.

Andamios de rieles, de forma predeterminada, devuelve head :ok con éxito update. Esto no coincide con Backbone. Para solucionarlo, devuelva el JSON en su lugar:

render json: @entity 

(donde @entity es lo que su variable está en la acción)

+0

¡Está funcionando ahora, gracias por su ayuda! – ben

0

Backbone espera que el JSON desde el servidor, y el servidor devuelve con un texto.

Para solucionar este al lado del cliente, establezca el tipo de datos que texto en lugar de JSON, y el servidor está esperando tipo de contenido como JSON .

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

Su código actualizado sigue,

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

El tipo de datos de texto no será analizado por Backbone después de guardar.

Cuestiones relacionadas