ppedrazzi
ppedrazzi

Reputation: 787

Iron Router OnBefore Hook with Params URL Not Calling Function

I am looking to restrict access to a page using iron router, but the before function doesn't seem to be running.

# 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']

Upvotes: 0

Views: 202

Answers (2)

ppedrazzi
ppedrazzi

Reputation: 787

Turns out that for routes with "/" you need to use ".".

So in this case I used:

only: ["challenge.:_id"]

Problem solved!

Upvotes: 3

fuzzybabybunny
fuzzybabybunny

Reputation: 5254

You have to be careful to account for when a user is logged in, not logged in, and when they are logging in.

The following is code for a requireLogin function that I place in a onBeforeAction hook.

If there's no Meteor user, check to see if they're logging in, and if so, render a loading template.

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']});

EDIT

Ok, this is what's happening:

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

What's not perfectly clear from the documentation is what kind of arguments the array takes in the onBeforeAction

Router.onBeforeAction(requireLogin, {only: ['routeName', 'anotherRouteName']});

Here's a set of routes that work with the hook:

  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']});

Upvotes: 0

Related Questions