铁路由器OnBefore钩与参数URL不调用功能

时间:2015-06-19 16:03:28

标签: meteor iron-router

我希望使用铁路由器限制对页面的访问,但是之前的功能似乎没有运行。

# Limit which challenges can seen to members.
isMemberHook = () ->
    challenge = Challenges.findOne _id: @params._id
    if Meteor.userId() in challenge.members
        @next()
    else
        @redirect '/'

Router.onBeforeAction isMemberHook,
    only: ['/challenge/:_id']

2 个答案:

答案 0 :(得分:3)

事实证明,对于带有“/”的路线,您需要使用“。”。

所以在这种情况下我使用了:

only: ["challenge.:_id"]

问题解决了!

答案 1 :(得分:0)

您必须小心考虑用户何时登录,未登录以及何时登录

以下是我放在requireLogin挂钩中的onBeforeAction函数的代码。

如果没有Meteor用户,请检查他们是否正在登录,如果是,则渲染加载模板。

var requireLogin = function() {
  if (! Meteor.user()) {
    if (Meteor.loggingIn()) {
      this.render(this.loadingTemplate);
    } else {
      this.render('AdminLogin');
    }
  } else {
    this.next();
  }
};

Router.onBeforeAction(requireLogin, {only: ['AdminMain', 'postSubmit', 'appointmentsList', 'AppointmentShow']});

修改

好的,这就是发生的事情:

https://github.com/iron-meteor/iron-router/blob/devel/Guide.md#applying-hooks-to-specific-routes

文档中不完全清楚的是数组在onBeforeAction

中采用了哪种参数
Router.onBeforeAction(requireLogin, {only: ['routeName', 'anotherRouteName']});

这是一组与钩子一起使用的路线:

  this.route('/order', {
    template: 'order',
    name: 'order',
    layoutTemplate: 'layout'
  });

  this.route('/order/:_id', {
    template: 'order',
    name: 'orderEdit',
    layoutTemplate: 'layout',
    data: function(){
      var id = this.params._id;
      alert(id);
    }
  });

  var beforeHook = function(){
    console.log("beforeHook run!");
    alert("safsf");
  };

  Router.onBeforeAction(beforeHook, {only: ['orderEdit']});