2015-04-14 2 views
1

Я использую стандартный утюг: маршрутизатор шаблон для обеспечения того, чтобы пользователь прошел аутентификацию перед доступом к маршруту:утюг: маршрутизатор beforeAction логин AND данные: функция?

authenticatedController = RouteController.extend({ 
    onBeforeAction: function(){ 
    if (Meteor.user()){ 
     var route = Router.current().route.getName(); 
     this.next(); 
    } else this.render('login'); 
}) 

Это работает очень хорошо для непараметризованных маршрутов, например:

Router.route("profile",{ 
    name: "profile", 
    controller: 'authenticatedController' 
}); 

Когда я попытаться распространить эту модель на параметризуемый маршрут, например:

Router.route('/foo/:id',{ 
    name: 'foo', 
    controller: 'authenticatedController', 
    data: function(){ return myCollection.findOne({ _id: this.params.id }); } } 
}); 
  1. Это работает, если пользователь уже вошел в
  2. Я получаю страницу 404, если пользователь не вошли в

кажется, что beforeAction работает после функции данных. Начиная с myCollection не публикует никаких документов, пока пользователь не выполнит вход в систему: маршрутизатор решает, что маршрут не существует.

Единственный раз, когда я хочу 404, если поиск коллекции ничего не возвращает.

+0

пытались ли вы на Router.configure? 'notFoundTemplate: 'notFound',' и hook 'Router.onBeforeAction (' dataNotFound ', {only:' profile '}); ' – Ethaan

+0

Спасибо, Ethann - У меня есть' notFoundTemplate:' notFound' - вот как показывают мои 404. Я не пробовал «Router.onBeforeAction» («dataNotFound», {only: 'profile'}); 'потому что я действительно хочу 404, если id не существует (или кто-то оставляет некоторые из них при резке/вставке URL) –

ответ

0

Я использую следующий шаблон, который хорошо работает для меня:

//I create a hook for authentication 
var userAuthHook = function() { 
    if (Meteor.userId()) { 
     this.next(); 
    } else { 
     this.redirect('/login'); 
    } 
}; 

//I apply this hook to all routes except login 
Router.onBeforeAction(userAuthHook, { 
    except: ['login'] 
}); 

//if I want a 404 error, I put it in a onAfterAction callback 
Router.route('/message/:_id', { 
    name: 'message', 
    waitOn: function() { 
     return [...]; 
    }, 
    onAfterAction: function() { 
     //we wait for the 'waitOn' data to be ready 
     if(this.ready()) { 
      var message = Messages.findOne({_id: this.params._id}); 
      if(!message) { 
       //if there is no corresponding message we render the 404 template 
       this.render('error404'); 
      } 
     } 
    } 
}); 

Я надеюсь, что это будет работать для вас тоже.

+1

Merci Guilllaume. Использование 'onAfterAction' для обработки 404s очень полезно. Однако ваш шаблон не устанавливает контекст данных для шаблона. Мне еще нужно установить контекст данных в помощнике шаблона, а не получать его с маршрутизатора. Также, если вы выполняете 'this.redirect ('login')' в своем 'beforeAction', а не' this.render ('login'), то пользователь не будет отправлен на предполагаемый маршрут после входа в систему. –