Backbone modèle.save() est à l'origine de POST pas METTRE
J'ai une épine Dorsale modèle:
var User = Backbone.Model.extend({
idAttribute: '_id',
url: '/api/user',
defaults:
{ username: ''
}
});
Je le chercher:
var user = new User();
user.fetch();
Aujourd'hui, comme une click
événement dans l'un de mes points de vue, j'ai ceci:
toggleSubscription: function () {
user.set('subscriptions', true);
user.save();
}
Cela provoque une requête POST. Toutefois, l'enregistrement existe déjà sur le serveur, et depuis, je l'ai récupéré (et le modèle de l'instance a un id
bien), j'ai pensé que l'épine Dorsale devrait faire METTRE à la place d'un POSTE. Pourquoi pourrait-il être faire un POST à la place?
Mettre à l'intérieur de toggleSubscriptions: console.journal( de l'utilisateur.la méthode toJSON() ); console.journal( de l'utilisateur.isNew() ); et coller ici les résultats s'il vous plaît
OriginalL'auteur | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
Essayez de vérifier
user.isNew()
.Dirait que vous vous êtes créé un nouveau modèle qui n'a pas une identité, c'est pourquoi il essaie de l'ajouter lors de
Backbone.sync
.Mise à JOUR:
Ci-dessus est tout à fait vrai. Il ne
POST
parce que c'est un nouveau modèle (qui signifie, qu'elle n'a pas un id). Avant de chercher un modèle, vous devez donner un id. Dans votre exemple:id
est un attribut ou une propriété deuser
.isNew
est égal àfalse
. Pouvez-vous expliquer cela?+1 a déjà été fait;
non, l'id n'est PAS récupéré depuis le serveur lorsque vous essayez de récupérer un nouveau modèle. Seulement lorsque vous récupérer une collection de vos modèles de charge avec des identifiants.
Si vous avez des id utilisateur, et ne
user = new User({ id: 123 })
fetch va travailler sans id c'est toujours un nouveau modèle. Comme je l'ai dit, lorsque vous récupérer de collecte, il charge les modèles avec des identifiants. Mais lorsque vous utiliseznew User()
- il crée un nouveau modèle d'utilisateur, et maintenant vous ne pouvez l'enregistrer (par la POSTE) - dans ce cas, il pourra obtenir un id de serveur de côté et être retourné à l'id de POSTE est un succès, et permettra de mettre à jour ce nouveau modèle d'utilisateur. Après cela, vous pouvez faire de l'utilisateur.save() et il va faire une MIS.Bien lorsque vous chercher, comment voulez-vous de colonne vertébrale, à savoir le modèle à charger? Lire ce backbonejs.org/#Sync - vous chercher toujours à l'aide de l'OBTENIR, alors, vous avez toujours besoin d'un ID:
read → GET /collection[/id]
(même pour les modèles). Pensez à ce sujet - sur le côté serveur, lorsque vous lisez un enregistrement spécifique à partir de la base de données, vous avez besoin de la clé primaire. Même ici.OriginalL'auteur mvbl fst
si le modèle n'a pas encore d'identifiant, il est considéré comme neuf... ET donc épine dorsale va faire un
PUT
demande plutôt que d'unPOST
.Ce comportement peut être remplacée simplement par l'ajout de
type: 'POST'
à votre bloc de sauvegarde:OriginalL'auteur Lane
Utilisation urlRoot de propriété pour définir l'URL de base
/api/user
. Puis/api/user
lorsque vous enregistrez un modèle qui n'a pas_id
jeu de propriétéset
/api/user/{_id}
lorsque vous enregistrez un modèle qui a_id
ensemble de propriétés. Notez qu'il ajoute automatiquement_id
valeur de l'URL de base.Il va chercher la valeur de
_id
bien parce que vous avez mis la valeur àidAttribute
.OriginalL'auteur IsmailS
La réponse du serveur doit être de cette façon:
Parce que vous définissez _id en tant que clé primaire. Lorsque le modèle est chargée de vérifier la valeur de _id il doit avoir une valeur:
console.journal( le modèle.get('_id') );
Ma pensée est que vous mettez dans votre colonne vertébrale modèle '_id' comme clé primaire, mais le service est de vous ramener 'id'
Mise à jour: Ajout d'un exemple de code de comportement normal:
De sortie:
METTRE /api/utilisateur 405 (Méthode Non Autorisée)
POST /api/utilisateur 404 (Non Trouvé)
Vérifier comment la première instance de ce Modèle possède un id et il essaie de faire de la METTRE, mais l'autre POST. Je ne peux pas reproduire le problème, donc, ma pensée est que le problème est dans votre réponse du serveur.
_id
par choix.model.get('_id')
renvoie l'ID, commemodel.id
.J'ai mis à jour ma réponse, j'ai essayé votre cas d'utilisation, à l'aide de votre modèle et je ne peux pas reproduire votre problème. Pourriez-vous coller ici votre première réponse du serveur? Je pense que là est la question.
OriginalL'auteur Daniel Aranda
Il peut être utile de vérifier si peut-être
emulateHTTP
est vrai. Cela permettra de changer toutes vos MISES en POST avec un_method
en-tête (vous pouvez également vouloir vérifier que cela existe pour confirmer l'idée).OriginalL'auteur Tallmaris