2013-02-18 3 views
6

Я пытаюсь выяснить, как использовать slug (атрибут моей модели) в моих маршрутах ember, чтобы получить чистые URL-адреса.Использование slug в emberjs-маршруте

Я хотел бы, чтобы мои маршруты выглядеть следующим образом:

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

Вместо:

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

Как вы можете видеть, я хотел бы заменить идентификатор статьи новостей с фактический атрибут 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_id на newsitem_slug, но это не работает. Любые другие предложения?

ответ

8

Большое спасибо Michael указал мне в правильном направлении. Но, я думаю, это потому, что я работаю в rc-1 версии ember, мне не пришлось переопределять крючок модели для этого. Единственное, что мне нужно было сделать:

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

работает в RC6, спасибо :) – j10io

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 для записей, соответствующих указанному слизняка. Это сложнее, чем простой поиск на основе идентификаторов, поскольку нам нужно перевести массив результатов запроса в одну запись. Более подробно о том, как это работает, см: how-to-find-a-model-by-any-attribute-in-ember-dot-js

Кроме того, необходимо будет осуществить serialize так, что уголек linkTo помощник сможет правильно создавать ссылки

+0

По какой-то причине крюк 'model' не вызывается. Я не вижу 'console.log', появляющийся в моей консоли. Есть идеи? (отладка показывает мне, что метод 'enter' маршрута называется) – polyclick

+0

Странный - можете ли вы отправить пример jsfiddle? –

+0

Вот он: http://jsfiddle.net/bitshiftcop/MqS4G/1/ console_log в 'NewsitemRoute' не запускается. – polyclick

Смежные вопросы