簡體   English   中英

在流星鐵路由器中使用子彈

[英]Using Slugs in Meteor's Iron Router

我正在嘗試定義一個使用Router的Iron Router路由:即。 字符串title但空格用連字符代替。

而不是/news/breaking%20news ,我們希望它是/news/breaking-news

Router.map(function() {
    this.route('news', {
        path: '/news/:title'
    })
})

為此,是否需要使用slug字符串創建一個新的文檔字段slug並使用path: '/news/:slug 還是有一種更優雅的方法來避免這個多余的字段?

應用正在使用aldeed:simple-schemaaldeed:collection2dburles:collection-helpers如果有幫助的話)。

約束性問題是從實際標題到子彈的單向不可逆轉換(例如,“ foo-bar”和“ foo bar”都以相同的子彈“ foo-bar”結尾,所以當您請參閱“ foo-bar”,您不知道實際標題是什么,因此您無法查找它)。 因此,除非您可以對此進行控制(例如,按照您的建議將段塞添加到文檔中,或者對應用程序中的標題強制執行嚴格的無連字符策略),否則您將需要一種存儲映射的方法。

解決此問題的一種可能方法是將文檔ID包含在URL中,並具有毫無意義的內容,這些內容可由路由器本身填充:

Router.route('/news/:_id/:slug?', ...) 

然后僅在實際路由中使用_id。 請注意,這允許您將所需的內容放在_id后面的URL中,以便“ news / [_ id] / foo-bar”和“ news / _id / foo%20bar”都進入同一頁面,(news / [_id]),但“ news / [_ id] / this_is_completely_有意義”也是如此。 然后,在路由器中,您可以根據需要重定向到適當的URL:

Router.route('/news/:_id/:slug?', {
  name: 'news',
  data: function() { return news.findOne({_id: this.params._id}); },
  onBeforeAction: function() { 
    var data = this.data();
    if (data) {
      var realUrl = '/' + data._id + '/' + slugify(data.title); // the desired URL, incl. whatever your slug fn is
      if (this.url.indexOf(realUrl) < 0) { 
        this.redirect('/news' + realUrl); // if we aren't at the desired URL, take us there
      }
    }

    this.next();
  }
}); 

然后,您必須控制任何“共享此頁面”功能,以確保它提供了所需的URL,但是如果有人嘗試轉到news / [_ id] / this_is_completely_意義上沒有意義,它將把它們重定向到news / [_ id] / FOO吧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM