为什么嵌套资源路由会重置Ember中的命名空间?

时间:2014-05-30 04:19:13

标签: ember.js

假设我有一个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/commentspost_comments帮助器。我有photo_comments路由,路由到comments,但我无法路由到/photos/:photo_id/comments。我意识到我可以通过执行以下操作来解决这个问题,但这似乎是多余的:

/posts/:posts_id/comments

TL / DR

我理解 Ember重置嵌套资源的路由,但我不明白为什么。有人可以向我解释一下吗?

1 个答案:

答案 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');