2014-12-07 47 views
1

我正在構建具有頁面版本的應用程序。我希望用戶能夠訪問該頁面,而不必指定他們希望開始使用的版本。如果沒有在URL中指定版本,我想查找該頁面的最新版本並重定向到該頁面。在路由器級別上的流星收集查找

我遇到的問題是,我無法在路由器級別上進行任何集合查找來找出我要查找的版本,因爲集合根本就不存在。

這裏是我到目前爲止的代碼:

Router.route('page', { 
    path: '/page/:slug/:version?', 
    onBeforeAction: function() { 
     var versionId = this.params.version; 

     if (!versionId) { 
      console.log('no version! oh noes!'); 

      var p = Pages.find({slug: this.params.slug}); 
      var newestVersion = Versions.findOne({page: p._id}, {sort: {createdAt: -1}}); 
      versionId = newestVersion._id; 

      Router.redirect('page', this.params.slug, versionId); 
     } 

     this.next(); 
    }, 
    waitOn: function() { 
     return Meteor.subscribe('page', this.params.slug, this.params.state); 
    }, 
    data: function() { 
     return { 
      page: Pages.findOne({slug: this.params.slug}), 
      version: Versions.findOne(this.params.version) 
     } 
    } 
}); 

任何幫助或洞察力非常感謝!

+0

'if(!version)'是一個錯字還是您的實際代碼? – 2014-12-08 00:13:03

+0

@Kyll Typo。謝謝。我重寫了一些代碼,以便在我的問題中更有意義。我在我的問題中糾正了它。 – 2014-12-08 00:26:45

+0

陳述在答案中,而不是評論^^ – 2014-12-15 08:12:11

回答

0

下面是我找到的解決方案。問題是,onBeforeAction實際上並沒有等到waitOn,除非你告訴它。

onBeforeAction: function() { 
    if (this.ready()) { 
     if (!this.params.version) { 
      var p = Pages.findOne({slug: this.params.slug}), 
       sortedVersions = _.sortBy(Versions.find({page: p._id}).fetch(), function(s) { 
        return v.createdAt; 
       }); 

      var newest_version_id = sortedVersions[0]._id; 
      this.redirect('page', {slug: this.params.slug, state: newest_version_id}); 
     } 

     this.next(); 
    } 
} 

我覺得關鍵是在this.ready()檢查時,在waitOn所有訂閱是真正的這是唯一正確的。我假設所有這些都是通過簡單地使用waitOn自動發生的。