2013-02-18 84 views
6

我想弄清楚如何在我的余烬路线中使用slu((我的模型的属性)来获得更清洁的网址。在emberjs路线中使用slu 012

我想,我的路线是这样的:

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

相反的:

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

正如你可以看到,我想,以取代与该newsitem的id实际的slug属性。这里是我的Newsitem模型看起来像:

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

嵌塞属性接到此格式的干净文本属性:title-in-slug-format

这是我的路由器地图此刻:

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

我试着用newsitem_slug替换newsitem_id,但这不起作用。还有其他建议吗?

回答

8

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

App.NewsitemRoute = Ember.Route.extend({ 
    serialize: function(model, params) { 
    return { newsitem_id: model.get('slug') }; 
    } 
}); 
+0

在RC6中工作,谢谢:) – j10io 2013-07-21 11:08:09

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匹配指定蛞蝓记录上面的例子。它比简单的基于id的查找更复杂,因为我们需要将查询结果数组转换为单个记录。有关如何工作的更多细节,请参见:how-to-find-a-model-by-any-attribute-in-ember-dot-js

你也将需要实现serialize让烬linkTo助手将能够正确地创建链接

+0

出于某种原因,不会调用'model'钩子。我没有看到console.log出现在我的控制台中。有任何想法吗? (调试显示我调用了路由的'enter'方法) – polyclick 2013-02-19 10:52:47

+0

奇怪 - 你可以发布一个示例给jsfiddle吗? – 2013-02-19 15:16:33

+0

这里是:http://jsfiddle.net/bitshiftcop/MqS4G/1/'NewsitemRoute'中的console.log没有被触发。 – polyclick 2013-02-19 20:30:22