6

我试图弄清楚如何在我的 ember 路由中使用 slug(我的模型的属性)来获得更清晰的 url。

我希望我的路线看起来像这样:

http://www.server.com/#/newsitems/newsitem-title-in-slug-format/1

代替:

http://www.server.com/#/newsitems/1/1

如您所见,我想用实际的 slug 属性替换 newsitem 的 id。这是我的Newsitem模型的样子:

App.Newsitem = DS.Model.extend({
    slug: DS.attr('string'),
    title: DS.attr('string'),
    summary: DS.attr('string'),
});

slug 属性以这种格式接收一个干净的文本属性:title-in-slug-format

这是我目前的路由器地图:

App.Router.map(function(){
  this.resource('newsitems', function(){
    this.resource('newsitem', {path:':newsitem_id'});
  });
});

我尝试将其替换为newsitem_idnewsitem_slug但这不起作用。还有其他建议吗?

4

2 回答 2

9

非常感谢迈克尔为我指明了正确的方向。但是,我认为这是因为我正在使用 rc-1 版本的 ember,我不必为此重写模型挂钩。我唯一要做的就是:

App.NewsitemRoute = Ember.Route.extend({
  serialize: function(model, params) {
    return { newsitem_id: model.get('slug') };
  }
});
于 2013-02-19T21:01:49.537 回答
2

完成这项工作需要几个步骤。首先,您需要自定义路由以覆盖模型挂钩:

App.NewsitemRoute = Ember.Route.extend({
  model: function(params) {
    console.log("Searching for newsitem with slug: ", params.newsitem_id);
    var newsitems = App.Newsitem.findQuery({ slug: params.newsitem_id });
    newsitems.one("didLoad", function() {
      newsitems.resolve(newsitems.get("firstObject"));
    });
    return newsitems;
  }
});

在上面的示例中,我们查询 App.Newsitem 以获取与指定 slug 匹配的记录。它比简单的基于 id 的查找更复杂,因为我们需要将查询结果数组转换为单个记录。有关其工作原理的更多详细信息,请参阅:how-to-find-a-model-by-any-attribute-in-ember-dot-js

您还需要实施serialize,以便 ember linkTo 助手能够正确创建链接

于 2013-02-18T23:27:45.870 回答