2012-02-03 4 views
13

私はバックボーンが新しく、Sinatraで設定しようとしていますが、単純な作成作業を行うことはできません。Backbone.jsメソッドがsinatraにパラメータを送信していない

ように、私は私のモデル/コレクションを設定した

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

}); 

HTMLは次のようになります。

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

とルビーは、次のようになります。

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

しかし、sinatra se rverはパラメータがteamMembers.create行になく、params[:team_id]と表示されます。私はバックボーンで何か愚かなことをしていますか?正しく初期化していないのですか?

私はhttp://documentcloud.github.com/backbone/#Collection-createhttp://documentcloud.github.com/backbone/docs/todos.htmlhttp://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/https://gist.github.com/1655019見てきたが、私はそこにすべての答えを見つけるように見えることはできません。私は何か愚かなことをしたように感じるが、それを見ることはできない!

答えて

15

私は、sinavraのjsonパラメータを正しく抽出する方法を知らないことが判明しました。このサイトから:http://mini.softwareas.com/posting-json-to-a-sinatra-mongodb-service、私は同じ問題を抱えていた

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

、私はparamsハッシュすなわちの代わりにrequest.body.read.to_sを使用する必要がありましたが分かりました。私はPHPになっています。 BackboneはPOSTデータをクエリ文字列ではなく普通のJSON文字列で送信するので、データは$_POSTで利用できません。バックボーンPOSTデータを読み込むには:

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

また$HTTP_RAW_POST_DATAから直接それを読むことができます。