Comment gérer l'erreur
Uncaught Error: No route matched the URL '...'
et afficher une page 404 personnalisée?
Remarque: Cette question a été posée avant et répond il y a plusieurs mois - mais ne fonctionne plus.
App.Router.map(function() {
//set up all of your known routes, and then...
this.route("fourOhFour", { path: "*path"});
});
.. où vous avez défini votre FourOhFourRoute pour afficher le message "aucun itinéraire trouvé" de votre choix. Vous pourrez accéder au chemin initialement demandé dans la route fourOhFour en tant que paramètre de chemin.
EDIT: juste pour plus de clarté - cette réponse est venue après que les autres ont été signalés de ne plus fonctionner.
EDIT 2: J'ai mis à jour la réponse pour refléter le commentaire de Yehuda Katz (si je me trompe, s'il vous plaît LMK).
Voici un exemple:
Je définis le dernier itinéraire dans mon routeur en utilisant un itinéraire générique voir: http://emberjs.com/guides/routing/defining-your-routes/#toc_wildcard-globbing-routes
J'ai un /not-found
route, voir la dernière route définie dans mon routeur /*path
pour attraper n'importe quelle chaîne de texte, voir: https://github.com/pixelhandler/blog/blob/master/client/app/router.js#L19
Router.map(function () {
this.route('about');
this.resource('posts', function () {
this.resource('post', { path: ':post_slug' });
});
this.resource('admin', function () {
this.route('create');
this.route('edit', { path: ':edit_id' });
});
this.route('not-found', { path: '/*path' });
});
Cette route effectue une redirection vers /not-found
, voir: https://github.com/pixelhandler/blog/blob/master/client/app/routes/not-found.js
import Ember from 'ember';
export default Ember.Route.extend({
redirect: function () {
var url = this.router.location.formatURL('/not-found');
if (window.location.pathname !== url) {
this.transitionTo('/not-found');
}
}
});
De plus, toute route ayant un hook (par exemple model
, beforeModel
, afterModel
) qui entraîne une promesse rejetée, peut utiliser l'action error
pour passer à la 404.
actions: {
error: function (error) {
Ember.Logger.error(error);
this.transitionTo('/not-found');
}
}
Ce qui rend un not-found
modèle, voir: https://github.com/pixelhandler/blog/blob/master/client/app/templates/not-found.hbs
<h1>404 Not Found</h1>
<p>
Perhaps you have a link that has changed, see {{#link-to 'posts'}}Archives{{/link-to}}.
</p>
Voici ma page 404: http://pixelhandler.com/not-found
Vous pouvez essayer d'ajouter une route fourre-tout à la fin de votre routeur:
App.Router.map(function() {
this.resource('post', ...);
this.resource('user', ...);
this.route('catchAll', { path: '/*' });
});
App.CatchAllRoute = ...
En Ember 2.x
À l'intérieur de App.Router.map
fonction, placez le code sous la fin de la fonction de rappel.
this.route('your_handler_route_name', { path: '/*path' });
Maintenant, chaque itinéraire fait PAS les captures par les itinéraires définis précédemment seront capturées par your_handler_route_name
route.
Solution 1
Pour afficher le contenu 404:
App.Router.reopen({
handleURL: function (url) {
try {
return this._super(url);
} catch (error) {
if (error.message.match(/No route matched the URL/)) {
return this._super('/404');
}
}
}
});
Si vous souhaitez également que l'URL passe au 404:
App.Router.reopen({
location: locationImplementation,
handleURL: function (url) {
try {
return this._super(url);
} catch (error) {
if (error.message.match(/No route matched the URL/)) {
this.transitionTo('404');
return this._super('/404');
}
}
}
});
Pour comprendre ce qui s'est passé ici, voyez la ligne 22636
Dans ember rc2.
Solution 2
Analyser l'URL actuelle et vérifier s'il existe une route ou une ressource à l'aide de App.Router.router.recognizer.hasRoute('route.path.goes.here');