假设我有一个Photo
模型和一个Post
模型,我希望这两个模型都有Comment
个。在Rails中,我的路线看起来像这样:
Rails.application.routes.draw do
resources :posts, only: [ :show ] do
resources :comments, only: [ :index ]
end
resources :photos, only: [ :show ] do
resources :comments, only: [ :index ]
end
end
这会产生以下路线:
GET /posts/:post_id/comments(.:format)
GET /posts/:id(.:format)
GET /photos/:photo_id/comments(.:format)
GET /photos/:id(.:format)
好的,有道理。如果我想获取ID为Comment
的{{1}} Photo
的路径,请使用9
。
如果我想在Ember中创建相同的路线,我会这样做:
photo_comments(9)
在Ember中,这会生成以下网址:
App.Router.map () ->
@resource 'posts', ->
@resource 'post', { path: '/:post_id' }, ->
@resource 'comments'
@resource 'photos', ->
@resource 'photo', { path: '/:photo_id' }, ->
@resource 'comments'
我仍然有#/loading
#/posts/loading
#/posts/:post_id/loading
#/posts/:post_id
#/posts
#/photos/:photo_id/comments
#/photos/:photo_id/loading
#/photos/:photo_id
#/photos/loading
#/photos
#/
#/photos/:photo_id/loading
和/posts/:posts_id/comments
,这就是我想要的。但是,因为Ember重置命名空间,所以我不再拥有/photos/:photo_id/comments
和post_comments
帮助器。我有photo_comments
路由,路由到comments
,但我无法路由到/photos/:photo_id/comments
。我意识到我可以通过执行以下操作来解决这个问题,但这似乎是多余的:
/posts/:posts_id/comments
TL / DR
我理解 Ember重置嵌套资源的路由,但我不明白为什么。有人可以向我解释一下吗?
答案 0 :(得分:3)
TL;由于过渡范式,DR资源必须是唯一的,实际上你只是覆盖了评论资源。
这是因为当您转换到路线时,您没有明确地调出整个路径。
this.transitionTo('photo', photo);
{{#link-to 'photo' photo}} My photo{{/link-to}}
因为这个资源必须是唯一的。
如果您位于应用的根目录并且希望跳到2级,那么您只需使用this.transitionTo('photo', photo)
,并不使用this.transitionTo('photos.photo', photo)
< / p>
如果要转换为多个动态资源的资源,则只需发送多个模型。 this.transitionTo('foo', bar, baz)
。
正如暗示的那样,你可以强迫人们在进行transitionTo / link-to时说出一条完整的路径,但是作者决定惩罚那些拥有重复资源的人,而不是惩罚所有人在转换时定义整个路径。 / p>
此外,我们了解到foo.bar
代表Ember中的resource.route
。我不认为这是为什么它的架构原因,更多的是关于它的陈述。
@resource 'posts', ->
@resource 'post', { path: '/:post_id' }
@route 'foo'
this.transitionTo('posts.foo');