在两个路径之间共享资源

时间:2014-04-07 13:45:58

标签: ember.js resources routes

我对JS和Ember相当新,所以请耐心等待我=)

在我的应用中,有两种类型的用户:超级用户和程序管理员。超级用户制作新程序并为其分配管理员。然后,我需要程序管理员能够进入一个页面,在那里他们可以选择他们想要处理的程序,并从中获取路径。

这是我当前的NON-WORKING router.coffee文件的外观:

App.Router.map ->

@resource 'su', ->

  @resource 'programs', ->
    @route 'new'
    @route 'edit', path: ':program_id/edit'

  @resource 'pm', ->
    @resource 'programs', path: 'pm/programs', ->
      @resource 'projects', path: ':program_id/projects', ->
       @route 'new'
       @route 'edit', path: ':project_id/edit'

我认为将程序列为资源两次导致我的应用程序获得“未捕获的类型错误无法调用方法”应该超过“未定义”,因为它可以在我从下午取出程序时起作用。

我不确定如何添加列出pm分配给

的所有程序的页面

1 个答案:

答案 0 :(得分:0)

首先,您应该将资源视为与数据模型匹配的内容,并将路由视为可在该数据模型上执行的操作,或以它为基础。在Ember初学者中常见的错误是试图以某种方式将模型关系放在路线组织的方式中。 “post”和“comment”资源的典型示例包含注释属于1个帖子的陷阱。甚至在那里资源嵌套可能是不必要的,因为复杂性应该依赖于模型关系,而不是路由。

所以一般来说,你提出的架构会严重缩放。特别是如果在某些时候你决定例如2名项目经理参与同一项目。因此,在这种情况下不需要将路由嵌套在其他路由中(例如,当将'pm'资源和路由放在'su'资源中时)。

我会将所有实体保持在路由级别,然后完成建立模型之间关系的工作。如果你愿意,你可以手工操作,或者你可以让Ember Data为您做到这一点(首先请检查它是否适合您的需求,因为它可能超大)。您的后端应该知道用户应该能够看到哪些项目/程序。

所以我的建议是组织路线:(我甚至可能只做一个简单的'用​​户'资源,让超级用户或项目经理状态成为模型中的属性,但我不知道你的数据模型,所以让我们假设他们有不同的数据结构......)

App.Router.map ->

  @resource 'su'

  @resource 'project_managers' path: '/project_managers' ->
    @route 'index' 
    @resource 'project_manager', path: '/:project_manager_id', ->
       @route 'show, path: '/' #at this route you could show info about the project manager, and its programs could be accessible through its model, like, e.g. model.programs.
       @route 'new', path: '/new'
       @route 'edit', path: '/edit'
       @route 'programs', path: '/programs' #or you could set a new route and a view for seeing the programs for this pm. (note *1)


  @resource 'programs', path: '/programs' ->
    @route 'index' #this route would provide a list of all programs (naturally you can decide which one are visible to the current user) 
    @resource 'program', path: '/:program_id', ->
       @route 'show, path: '/'
       @route 'new', path: '/new'
       @route 'edit', path: '/edit'

      
  @resource 'projects', path: '/projects', ->
    @route 'index'
    @resource 'project', path: '/:project_id', ->
       @route 'show, path: '/'
       @route 'new', path: '/new'
       @route 'edit', path: '/edit'

* 1:因为即使从那里你想进一步导航到特定的程序,也没有获得去'/ project_managers / 35 / programs / 4'而不是'/'的路径程序/ 4' 。即使API请求的URL可能是第一个(如果您操作Rails后端,则很可能)。

对不起,如果答案太长,我希望它能让你有一个更清晰的观点! :)