2012-08-02 13 views
5

Estoy intentando hacer mi primera aplicación RESTful con Backbone y Yii Framework. No tuve ningún problema con los métodos GET, pero estoy estancado ahora con el método POST, para crear un nuevo elemento.

que tienen un modelo de comentario en Backbone:

var commentModel = Backbone.Model.extend({ 

    urlRoot: "index.php/api/comments", 
    idAttribute: 'id', 

    defaults: { 
     content: "Empty comment", 
     status: 1 
    } 
}); 

En mi opinión agrego una función para crear un nuevo comentario a pasar los valores de la forma relativa:

on_submit: function(e) { 
      var new_comment = new Comment({author_id: this.$('#author_text').val(), content: this.$('#content_text').val(), post_id: this.$("#post_text").val(), status: this.$("#status_text").val()}); 

     new_comment.save(); 
     }, 

Mirando la solicitud con Firebug parece estar bien, en la pestaña POST puedo ver todos los valores:

JSON    
author_id "7" 
content "Epic fail" 
post_id "7" 
status "2" 

Source 
{"content":"Epic fail","status":"2","author_id":"7","post_id":"7"} 

Pero en mi php Api ¡la $ _POST var está vacía!

foreach($_POST as $var=>$value) { 

    if($model->hasAttribute($var)) 
     $model->$var = $value; 
    else 
     $this->_sendResponse(500); 
} 

¿Alguien tiene algunas ideas? Leyendo la documentación de Backbone.Sync Entiendo que debería usar POST para crear una solicitud.

He encontrado una solución conseguir los valores de:

file_get_contents('php://input') 

pero ID no se siente bien para mí ...

Gracias.

+1

Algo así http://stackoverflow.com/questions/10930789/insert-backbone-js-m odel-into-mysql-database/10931092 # 10931092? – nikoshr

+0

El valor '$ _SERVER ['REQUEST_METHOD']' es "POST", por lo que los valores deben estar dentro de la matriz $ _POST, ¿estoy en lo cierto? – Ingro

+0

No, el método es un POST, pero los datos se envían al cuerpo HTTP. No se envía como una forma regular sería con los parámetros establecidos y una aplicación/x-www-form-urlencoded como tipo de mimo. Verifique lo que se envía en este Fiddle http://jsfiddle.net/RK7LN/ – nikoshr

Respuesta

10

De Backbone.sync documentation,

Con la implementación predeterminada, cuando Backbone.sync envía una petición para salvar un modelo, se pasará sus atributos, serializado como JSON, y enviados en el cuerpo HTTP con tipo de contenido application/json.

lo que significa que no recibirá los datos en parámetros como en una publicación regular de formulario, pero en el cuerpo de la respuesta HTTP.

Tienes tres opciones para hacer frente a este comportamiento:

  1. modificar el código del servidor para entender solicitudes REST, véase por ejemplo Insert Backbone.js model into MySQL database
  2. Ver si Backbone.emulateJSON podría responder a sus necesidades
  3. sobrescritura Backbone.sync y envíe los datos para adaptarse mejor a su servidor
+0

Bueno, parece que hice una suposición equivocada. Gracias por la aclaración, ahora voy a hacer algunas pruebas y ver qué solución se adaptará mejor a mi aplicación. – Ingro

Cuestiones relacionadas