具有多个参数的铁路由器嵌套路由

时间:2014-05-12 22:50:15

标签: routing meteor iron-router

我有两个模型:sitesarticles。每个站点可以有多个文章。我想在这条路线中查看这篇文章:/siteName/articleFriendlyTitleUrl。目前我有帮助方法来制作这样友好的网址:

getFriendlyUrl = function(urlString){
  urlString = urlString.toLowerCase();
  urlString = str.replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '-');
  return urlString;
}

我的router.js文件:

this.route('showArticle', {
  path: '/article/:title'),
  layoutTemplate: 'artLayout',
  data: function(){
  viewData = {
    title: Articles.findOne({title: this.params.title}),
    site:  Sites.findOne({name: this.name})
  }
  return viewData;
});

任何人都知道如何实现这个?我也尝试过这条道路:

/:siteName/:articleId

但没有成功 - 有任何建议吗?

2 个答案:

答案 0 :(得分:5)

我建议在文章文档中保存slug。 当用户添加/编辑文章时,App可以使用Underscore.String.slugify函数(https://github.com/epeli/underscore.string)从标题生成slug。

具有多个参数的路线有效:

this.route('showArticle', {
  path: '/:siteName/:articleSlug'),
  ...
  data: function(){

     viewData = {
       title: Articles.findOne({slug: this.params.articleSlug}).title,
       site:  Sites.findOne({name: this.params.siteName})
     }
     return viewData;
  }
});

答案 1 :(得分:1)

最后我解决了这个问题:我已经按照建议将friendlyTitle字段添加到包含已解析文章标题的Articles集合中的对象(没有特殊字符)。

这是我的路线:

this.route('showArticle', {
    path: '/:site/:friendlyTitle',
    layoutTemplate: 'artLayout',
    data: function(){
        return Articles.findOne({friendlyTitle: this.params.friendlyTitle});
    }
});

:site字段包含已分配此文章的Sites集合中的对象的名称(在创建新文章时,我可以将其分配/发布到特定网站上)。