2012-11-14 12 views
19

Wzywam Zapisz za pomocą tego:Backbone model.save() wysyła PUT zamiast POST

console.log(this.model.isNew()); 
console.log(this.model); 

this.model.save({}, { 
    success: function (model, response, options) { 
     console.log(response); 
    }, 
    error: function (model, xhr, options) { 
     console.log(xhr.result.Errors); 
    } 
}); 

W isNew() zwraca false. Ale wyjście this.model ma identyfikator 0. (this.model.id jest 0, jak również)

mój adres URL jest url: ROOTAREA + "/Expenses/Entry/",

Aktualizacja działa poprawnie, oraz zastosowania PUT, jak oczekiwano.

Edycja: tutaj jest częścią mojego modelu

defaults: function() { 
     return { 
      DocumentDate: "", 
      JobNo_: "", 
      PhaseCode: "", 
      WorkTypeCode: "", 
      Description: "", 
      Quantity: 0, 
      UnitCost: 0, 
      ExpenseCurrencyCode: "", 
      ReimbursementCurrencyCode: "", 
      UnitofMeasureCode: "DIEM", 
      LineNo_: 0 
     }; 
    }, 
    idAttribute: "LineNo_", 

Odpowiedz

27

ID nie powinna istnieć nawet dla nowego wpisu. Problem dotyczy części, której nie pokazałeś - w części, w której tworzysz instancję, utwórz i zapełnij model.

Oto cytat z the Backbone documentation:

Jeśli model nie posiada jeszcze id, to jest uważany za nowy.

Z twojego kodu wynika jasno, że przypisujesz atrybut id. Twój backend powinien to robić. A ponieważ robisz to na kliencie, kręgosłup zakłada go nie nowy i używa PUT

+0

Mam zmienił się mój post pokazujący model. Czy powinienem zmienić LineNo_ na coś innego niż 0? – Rail24

+0

@ Rail24 Usuń go całkowicie, jeśli możesz. Backbone sprawdza, czy id ma wartość NULL, aby określić, czy jest nowy. Zobacz http://documentcloud.github.com/backbone/docs/backbone.html#section-63 – nikoshr

+0

Zmieniłem LineNo_ na domyślną wartość null i rozwiązało to mój problem! Dziękuję toninoj! – Rail24

2

Można określić identyfikator domyślnych, tylko upewnić się, że ustawione na null (isNew zostanie ustawiona na wartość true)

19

Powyższe odpowiedzi są poprawne pod tym względem, że jeśli model jesteś .save "ma szkielet atrybutu id, zamiast zamiast POST.

Takie zachowanie może być zmienione przez dodanie type: 'POST' do oszczędzania bloku:

var fooModel = new Backbone.Model({ id: 1}); 

fooModel.save(null, { 
    type: 'POST' 
}); 
+2

Dziękuję za Twój post, pomógł mi w podobnej sprawie. Dowiedziałem się (czytając źródło Backbone), że nie trzeba tworzyć modelu, zapisywać go, a następnie dodawać do kolekcji, wystarczy przekazać typ: 'POST' do metody create() kolekcji: fooCollection.create ({id: 1}, {type: 'POST'}); – Shu

+0

Aby uzyskać informacje na temat innych rozwiązań, zobacz: [Jaki jest najgorszy sposób na wymuszenie aktualizacji Backbone.sync, aby użyć POST zamiast PUT?] (Http://stackoverflow.com/q/8527694/1218980) –

Powiązane problemy