2012-02-03 18 views
13

Sono nuovo alla dorsale e sto provando a configurarlo in Sinatra, ma non riesco a ottenere una semplice creazione di lavoro.Backbone.js crea un metodo che non invia parametri a sinatra

ho creato il mio modello/collezione come così:

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

}); 

il codice HTML appare come:

<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> 
    <!-- ... --> 

e il rubino si presenta come:

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

Tuttavia, il sinatra se rver mostra solo params[:team_id], senza il parametro name sulla riga teamMembers.create. Sto facendo qualcosa di stupido in backbone? Non inizializzare qualcosa correttamente?

Ho guardato 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/ e https://gist.github.com/1655019, ma io non riesco a trovare alcuna risposta c'è. Mi sento come se avessi fatto qualcosa di stupido, ma non riesco a vederlo!

risposta

15

Si scopre che non ero io a sapere come estrarre correttamente i parametri json in sinatra. Da questo sito: http://mini.softwareas.com/posting-json-to-a-sinatra-mongodb-service, ho scoperto che ho dovuto usare request.body.read.to_s al posto del cioè params hash,

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

Ho avuto lo stesso problema. Sono su PHP, però. Poiché Backbone invia i dati POST non in una stringa di query, ma in una semplice stringa JSON, i dati non sono disponibili tramite $_POST. Per leggere i dati Backbone POST:

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

Si può anche leggere direttamente da $HTTP_RAW_POST_DATA.

Problemi correlati