6

残り火のルートでスラッグ(モデルの属性)を使用して、よりクリーンなURLを取得する方法を理解しようとしています。

ルートは次のようになります。

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

それ以外の:

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

ご覧のとおり、ニュースアイテムのIDを実際のslug属性に置き換えたいと思います。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ません。他に何か提案はありますか?

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に照会します。クエリ結果の配列を単一のレコードに変換する必要があるため、単純なIDベースのルックアップよりも複雑です。これがどのように機能するかの詳細については、「how-to-find-a-model-by-any-attribute-in-ember-dot-js 」を参照してください。

serializeまた、残り火のlinkToヘルパーがリンクを正しく作成できるように実装する必要があります

于 2013-02-18T23:27:45.870 に答える