Router.configure({ layoutTemplate: 'layout', loadingTemplate: 'loading', notFoundTemplate: 'notFound', waitOn: function () { return [ Meteor.subscribe('posts'), Meteor.subscribe('notifications') ]; } }); // C'est un nom de route, pas un nom de template. Mais IR le prend comme nom de // template par défaut. Router.route('/', { name: 'postsList' }); Router.route('/posts/:_id', { name: 'postPage', waitOn: function () { return Meteor.subscribe('comments', this.params._id); }, data: function () { // "this" is the matched route. return Posts.findOne(this.params._id); } }); Router.route('/posts/:_id/edit', { name: 'postEdit', data: function () { // "this" is the matched route. return Posts.findOne(this.params._id); } }); Router.route('/submit', { name: 'postSubmit' }); var requireLogin = function () { if (!Meteor.user()) { if (Meteor.loggingIn()) { // Défini dans Router.configure(). this.render(this.loadingTemplate); } else { this.render('accessDenied'); } } else { this.next(); } }; // Faire une 404 si la page matche la route postPage, mais pas son argument. // Déclenché pour toute valeur "falsy" (null, false, undefined, empty). Router.onBeforeAction('dataNotFound', { only: 'postPage' }); // Appliquer le contrôle d'accès à la route postSubmit. Router.onBeforeAction(requireLogin, { only: 'postSubmit' });