我有一个具有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
答案 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')
}