2017-09-15 9 views
0

J'essaie d'accéder à un itinéraire spécifique avec un champ spécifique dans mon modèle.Route page sans ID - Comment utiliser un autre champ?

Exemple: www.myPage.com/wedding/couple1 www.myPage.com/wedding/couple2

Tous les exemples que je trouve dans l'ID d'utilisation communautaire de Ember, mais je suis en train d'utiliser un autre (que je ferai en sorte d'être unique).

Ma config d'itinéraire:

Router.map(function() { 
    this.route('create-wedding'); 
    this.route('weddings'); 
    this.route('wedding', { path: 'wedding/:pageName' }); 
}); 

Mon lien vers la route:

{{#link-to 'wedding' wedding.pageName}}Access{{/link-to}} 

Essayer d'obtenir l'enregistrement:

model(params) { 
    return this.store.query('wedding', { orderBy: 'pageName', equalTo: params.pageName }); 
} 

Mais, comment obtenir le record du Paramètre spécifique "nompage" dans mon modèle de routage? Et comment obtenir le même enregistrement lorsque l'utilisateur accède à la page directement à partir de l'URL?

Merci à l'avance

Répondre

0

Si votre champ non-id est vraiment, vraiment unique (à savoir l'unicité appliquée à l'arrière), vous pouvez l'utiliser comme identifiant d'extrémité avant en écrivant un sérialiseur personnalisé.

export default DS.JSONSerializer.extend({ 
    primaryKey: 'other_unique_key' 
}); 

Si vous utilisez une fin REST arrière, juste pour échanger sur DS.JSONSerializerDS.RESTSerializer dans le code ci-dessus. Cela vous permettra de suivre de près les conventions d'Ember pour la gestion des enregistrements par ID. Vous pouvez en savoir plus sur la création de sérialiseurs personnalisés here in the Guides.

Une autre alternative consiste à utiliser des paramètres de requête. Dans ce cas, votre URL ressemblerait plus à http://example.com/weddings?wedding=romeojuliet

En savoir plus sur les paramètres de requête et d'accéder à leurs valeurs here in the Guides.

+0

J'utilise Firebase comme ma base de données. Comment puis-je configurer mon sérialiseur avec Rest (si je ne me trompe pas, Firebase utilise Rest). –

+0

Facile, remplacez le code ci-dessus par RESTSerializer au lieu de JSONSerializer. Et avoir une lecture via https://emberjs.com/api/ember-data/2.14/classes/DS.RESTSerializer/properties/primaryKey?anchor=primaryKey – handlebears

+0

Lorsque j'ai fait les changements, j'ai eu l'erreur: Échec de l'assertion: normalizeResponse doit renvoyer un document d'API JSON valide: \t * Une ou plusieurs des clés suivantes doivent être présentes: "données", "erreurs", "méta". –

0

Plus de détails peuvent être trouvés ici. https://guides.emberjs.com/v2.15.0/models/finding-records/

Pour cette ligne de travailler return this.store.query('wedding', { orderBy: 'pageName', equalTo: params.pageName });

Vous aurez besoin de filtres de configuration sur votre API qui utiliseront ces params.

Vous pouvez également sérialiser un nouvel ID ou configurer l'API pour consommer un slug au lieu d'un ID. Dans ce cas, vous pouvez faire une recherche directe comme ça. Techniquement, vous devriez utiliser queryRecord à la place de la requête dans le cas d'un seul enregistrement.

Et s'il s'agit d'un seul enregistrement, quel est le but de orderBy?

And how do I get the same record when the user access the page directly from the URL?

Parce que vous avez cela dans votre routeur.this.route('wedding', { path: 'wedding/:pageName' });

Vous êtes déjà configuré pour y accéder directement dans votre URL nom_domaine/mariage/pagename