2012-01-15 11 views
2

誰かが投稿のContentTypeをjson/applicationに指定する方法を知っていますか?私はそうだと思っていましたが、バックボーンはデフォルトでそれを行いましたが、プレーンテキスト(コメントを参照)が得られているということで判断すると、別の方法で指定する必要があります。Backbone.js投稿500エラー

私はBackbone.jsを使用していますが、TastyPie APIにPOSTしようとしていますが、これは読み込み専用ではなく、モデルを作成して.save()しようとすると500エラーが表示されます。 http://documentcloud.github.com/backbone/docs/backbone.html#section-124

Backbone.sync = function(method, model, options){ 
     var type = methodMap[method]; 
     var params = _.extend({ 
     type: type, 
     dataType: 'json' 
     }, options); 

     if (!params.url){ 
     params.url = getUrl(model) || urlError(); 
     } 

     if (Backbone.emulateJSON){ 
     params.contentType = 'application/json'; 
     params.data = params.data ? {model: params.data} : {}; 
     } 

     if (Backbone.emulateHTTP){ 
     if(type === 'PUT' || type === 'DELETE'){ 
      if (Backbone.emulateJSON) params.data._method = type; 
      params.type = 'POST'; 
      params.beforeSend = function (xhr){ 
       xhr.setRequestHeader('X-HTTP-Method-Override', type); 
      }; 
     } 
     } 

     if (params.type !== 'GET' && ! Backbone.emulateJSON){ 
     params.prorcessData = false; 
     } 

     return $.ajax(params); 
     }; 





    $.fn.serializeObject = function() 
    { 
     var o = {}; 
     var a = this.serializeArray(); 
     $.each(a, function() { 
     if (o[this.name] !== undefined) { 
      if (!o[this.name].push) { 
      o[this.name] = [o[this.name]]; 
      } 
      o[this.name].push(this.value || ''); 
     } else { 
      o[this.name] = this.value || ''; 
     } 
     }); 
     return o; 
    }; 

    $(function() { 
     $('form').submit(function() { 
     var dict = $('form').serializeObject(); 
     var new_task = new Backbone.Model({ 
     date: toString(dict.date), 
     name: toString(dict.name), 
     priority: toString(dict.priority)}); 
     console.log("new_task =" + new_task); 
     new_task.save(); 
     console.log(dict); 

     return false; 
     }); 

    }); 


    }); 
+0

を提出する権利、フォーム上にありますか?どのような500の応答を取得しますか?私は最近、tastypieとバックボーンを組み合わせたアプリを作った。あなたはそれをここでチェックすることができます:https://github.com/c4urself/ratebeer多分それはあなたにいくつかのアイデアを与えるでしょう。 – c4urself

+0

: "text/plain"の形式にはデシリアライズの方法がありませんでした。シリアライザで '' formats''と '' content_types''を確認してください。 "、 – user784756

+0

ポールの解答は正しいが、 TastypieはまだX-HTTP-Method-Overrideヘッダーをサポートしていません。オーバーライドされたメソッドで使用しているResourceクラスを追加するには、次のようにするか、直接拡張してください:https://gist.github.com/2161338 –

答えて

3

は、あなたのコード内でBackbone.emulateJSON = true;を設定してみてください:これは私がここで見つけるというのが私の同期のために使用していたコードスニペットです。

これがtrueに設定されている場合は、contentTypeがあなたが探している 'application/json'に設定されます。あなたは一度だけこの変数を設定する必要が

は、とても良い場所は、「通常の」backbone.sync右のコード

$(function() { 
    Backbone.emulateJSON = true; 
    $('form').submit(function() { 
     ...