2015-05-29 2 views
0

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

который я видел в Интернете, но это, кажется, быть предотвращены мой 'loading' шаблон из когда-либо показывать, и вместо этого показывает параметр по умолчанию

Загрузка ...

в верхнем левом углу экрана. Если я меняю this.render('Home'); на this.redirect('/') Я вижу правильный шаблон загрузки. Однако в маршруте '/' я вызываю еще this.render('Home'), который, я думаю, затем снова вызывает onBeforeAction, который, в свою очередь, перенаправляет на '/', что означает, что вы сейчас находитесь в бесконечном цикле загрузки.

Итак, что является правильным способом исправить мой Router.onBeforeAction, чтобы достичь моей заброшенной цели, чтобы убедиться, что пользователи, которые не вошли в систему, могут видеть только шаблон независимо от того, какой URL они набирают, и сделать это, не нарушая мою пользовательскую загрузку шаблон в другом месте на сайте?

ответ

1

Вам нужно иметь два перед крючками. Один из них предназначен для «загрузки», а один - для проверки того, вошел ли пользователь в систему.

«Нагрузка» связана с вашими подписками и обычно представляет собой предустановленный крюк с железным маршрутизатором.

Router.onBeforeAction(function() { 
    if (! Meteor.userId()) { 
    this.render('Home'); 
    } else { 
    this.next(); 
    } 
}, {except: ['route_one', 'route_two']}); 

Router.onBeforeAction('loading'); 

Ваш маршрут:

Router.route('/', { 
    name: 'home', 
    subscriptions: function() { 
     //Array of Meteor.subscribe to wait for and display the loading template 
     return [Meteor.subscribe("a_subscription")] 
    }, 
    loadingTemplate: 'loading', 
    action: function() { 
     this.render("Home_logged_in"); 
    } 
}); 

Так вот, если Meteor.subscribe("a_subscription") загружается он будет отображать loading шаблон. Если пользователь вошел в систему, он отобразит шаблон Home_logged_in и, если он не войдет в систему (на любом маршруте), Home.

Вы также можете установить исключения, используя имена «route_one» и «route_two» для ваших шаблонов (которые вы можете переименовать во что-либо еще). Я назвал ваш домашний шаблон home. Но если вы добавили home в список except, onBeforeAction не относится к home.

+0

Спасибо, я попробую сегодня вечером после работы. Только для некоторого контекста этот вопрос имеет больше моего кода: http://stackoverflow.com/questions/30512782/correct-way-to-manage-routes-after-sign-in-for-different-roles. Кажется, у меня немного другой формат для моего «маршрута». Вы бы порекомендовали меня изменить их в соответствии с вашими? – Dan

+0

@ В том же формате, который вы можете использовать либо waitOn, либо подписки, результат должен быть таким же.Возможно, вам придется добавить «loadingTemplate» и «name». Я также рекомендую использовать «действие» для ваших маршрутов, как указано выше, вместо использования 'before', поскольку шаблон, который вы используете, слегка устарел. – Akshat

+0

работает :) спасибо! – Dan

1

Я использую этот onBeforeAction крюк, который перенаправляет на главную страницу, если пользователь не вошел в систему:

var userAuthHook = function() { 
    if (Meteor.userId()) { 
    //continue to the requested url 
    this.next(); 
    } else { 
    //redirect to home 
    this.redirect('/'); 
    } 
}; 

Router.onBeforeAction(userAuthHook, { 
    except: ['home'] 
}); 

Router.route('/', { 
    name: 'home' 
}); 

Обратите внимание, что я исключаю домашнюю страницу с крючка, чтобы избежать перенаправления петель и что в / маршрут называется «дом», на который следует ссылаться в исключениях крючка.

Это работает для меня, а также позволяет использовать шаблоны загрузки.

+0

Спасибо, я попробую, когда я вернусь домой позже. Я пытался использовать 'except' (хотя и по-другому), но я не назвал свои маршруты, возможно, это была проблема – Dan

Смежные вопросы