将transitionToRoute与具有自定义slug的模型一起使用

时间:2014-02-26 16:44:39

标签: ember.js

我有一个具有id的ember-data模型以及服务器生成的自定义slug属性(如果重要的话,前缀为id)。

我想在所有公共路由中使用slug而不是id。为此,我更换了路由器:

App.Router.map ->
  @resource 'strategies', path: '/strategies', ->
    @resource 'strategy', path: ':strategy_slug'

并覆盖相应路线的serialize方法:

App.StrategyRoute = Ember.Route.extend()
  serialize: (model) ->
    {
      strategy_slug: model.get('slug')
    }

不幸的是,当从控制器使用transitionToRoute转换到例如/strategies/123-test时,这似乎不起作用:

App.ExampleController = Ember.ObjectController.extend()

  [...]

  actions:
    showDetails: ->
      @transitionToRoute("/strategies/#{@get('slug')}")
      false

(其中@get('slug')返回'123-test'

调用showDetails操作后,我在控制台中获得的所有输出都是:

Transitioned into 'strategies.index'

Ember确实认识到了基于slug的路线。

Ember: 1.5.0-beta.2+pre.3ce8f9ac
Ember Data: 1.0.0-beta.6

有什么我可能错过的吗?

修改

以下变体在这种情况下有效且可行,但我有另一个用例,我只能访问该URL。

App.ExampleController = Ember.ObjectController.extend()

  [...]

  actions:
    showDetails: ->
      @transitionToRoute('strategy', @get('content'))
      false

1 个答案:

答案 0 :(得分:0)

我最终想出了如何解决这个问题。关键是向路由器添加model方法,路由器知道如何将slug转变为模型:

App.StrategyRoute = Ember.Route.extend()
  model: (params, transition) ->
    App.store.getById('strategy', parseInt(params.strategy_slug))

  serialize: (model) ->
    {
      strategy_slug: model.get('slug')
    }