我正在试图弄清楚如何在我的余烬路线中使用slug(我的模型的属性)以获得更清晰的网址。
我希望我的路线看起来像这样:
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_id
替换newsitem_slug
,但这不起作用。还有其他建议吗?
答案 0 :(得分:9)
非常感谢迈克尔指出我正确的方向。但是,我认为这是因为我在rc-1版本的ember中工作,我没有为此重写模型钩子。我唯一要做的就是:
App.NewsitemRoute = Ember.Route.extend({
serialize: function(model, params) {
return { newsitem_id: model.get('slug') };
}
});
答案 1 :(得分: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帮助程序能够正确创建链接