2012-02-03 11 views
13

Soy nuevo en la red troncal y trato de configurarlo en Sinatra, pero parece que no puedo hacer que funcione una simple creación.Backbone.js crea un método que no envía parámetros a sinatra

He creado mi modelo/recogida como tal:

var TEAM_ID = window.location.pathname.split('/')[1]; // From url 
$(function() { 
    var TeamMember = Backbone.Model.extend({ 
    defaults: { 
     name : "" 
    } 
    }); 

    var TeamMembers = Backbone.Collection.extend({ 
    model: TeamMember, 
    url: "/" + TEAM_ID + "/team-members.json" 
    }); 

    var teamMembers = new TeamMembers; 

    var TeamMemberView = Backbone.View.extend({ 
    events: { 
     "click #new-team-member-form .submit-button" : "handleNewTeamMember" 
    }, 
    handleNewTeamMember: function(data) { 
     var inputField = $('input[name=new_team_member_name]'); 
     console.log("Pre create"); 

     // This doesn't get sent to the server!! 
     var teamMember = teamMembers.create({name: inputField.val()); 

     console.log("Post create"); 

     return false; // Don't submit form 
    }, 
    render: function() { 
     console.log("Render team member"); 

     return this; 
    } 
    }); 

    // ... 

    var teamMemberView = new TeamMemberView({el: $('#week-view')}); 

}); 

el código HTML siguiente aspecto:

<table id="week-view"> 
    <!-- ... --> 
    <form id="new-team-member-form" action="/some-add-url" method="post"> 
    <fieldset class="new-object-fieldset" title="New team member"> 
     <legend>New team member</legend> 
     <label for="new_team_member_name">Add new</label> 
     <input type="text" name="new_team_member_name" title="Add member" class="new-object-text-box" /> 
     <button type="submit" name="new_team_member" value="new_team_member" class="submit-button">+</button> 
     <div id="help-new"></div> 
    </fieldset> <!-- New team member --> 
    </form> 
    <!-- ... --> 

y el rubí se parece a:

post '/:team_id/team-members.json' do 
    logger.info("Add team member (json): #{params}") 
end 

Sin embargo, el sinatra se rver solo muestra params[:team_id], sin el parámetro name en la línea teamMembers.create. ¿Estoy haciendo algo estúpido en la columna vertebral? ¿No está inicializando algo correctamente?

He mirado en http://documentcloud.github.com/backbone/#Collection-create, http://documentcloud.github.com/backbone/docs/todos.html, http://liquidmedia.ca/blog/2011/01/backbone-js-part-1/, http://liquidmedia.ca/blog/2011/01/an-intro-to-backbone-js-part-2-controllers-and-views/ y https://gist.github.com/1655019, pero me parece que no puede encontrar ninguna respuesta allí. Siento que he hecho algo estúpido, ¡pero no puedo verlo!

Respuesta

15

Resulta que no era yo quien sabía cómo extraer correctamente los parámetros json en sinatra. Desde este sitio: http://mini.softwareas.com/posting-json-to-a-sinatra-mongodb-service, descubrí que tenía que usar en lugar de la request.body.read.to_s es decir params hachís,

post '/:team_id/team-members.json' do 
    request_body = JSON.parse(request.body.read.to_s) 
    team_member_name = request_body["name"] 
    # ... 
end 
4

que tenían el mismo problema. Estoy en PHP, sin embargo. Como Backbone envía datos POST no en una cadena de consulta, sino en una cadena JSON simple, los datos no están disponibles a través del $_POST. Para leer los datos POST Backbone:

// the 'true' param returns an array rather than an object 
$post = json_decode(file_get_contents('php://input'), true); 

También puede leer directamente desde $HTTP_RAW_POST_DATA.

Cuestiones relacionadas