在Rails中,如何嵌套自定义路由?

时间:2015-05-28 11:04:28

标签: ruby-on-rails rails-routing

我有3个资源。

  • Projects
  • Books
  • Chapters

ProjectsBooks通过ProjectBooksBooks has_many Chapters,即Books属于/projects/1

我可以轻松设置/books/2/chapters/3以及Books的基本路线。

如何仅列出附加到给定项目的Books?如何添加与Project相关的/books/2的信息?

因此,我的路线应该是:

  • /projects/1 - show book 2
  • /projects/1/books - show project 1
  • /projects/1/books/2/chapters - 列出项目1中的书籍和其他信息
  • books - 有关项目1的第2册中的章节的信息

我原来的想法是ProjectsController上使用resources :projects do get :books, on: :member end 方法的自定义路线。路由:

/projects/1/books/2/chapters

但这并不能让我得到resources :projects, param: :name do resources :books do resources :chapters end end

然后我考虑了嵌入式资源:

projects#books

哪个有效,但不是调用books#index,而是调用#chapters,它真正列出了所有图书,并且无法让我在项目的上下文中获得Books

我如何应对以下双重挑战:

  1. Project可以单独列出,也可以在Project
  2. 的上下文中列出
  3. ProjectsController
  4. 的上下文中列出时添加特定信息

    编辑:

    我的假设是只有Books可以发现哪个ProjectsController是此项目的一部分,当然只有Project知道如何添加class Plan < ActiveRecord::Base belongs_to :patient has_many :structures,dependent: :destroy end ######## class Structure < ActiveRecord::Base belongs_to :plan end - 特定数据,如统计数据。如果我的假设是关闭的,并且有一种不同的方式来构建它,那就是它。

1 个答案:

答案 0 :(得分:0)

这是一个想法:

您可以执行类似

的操作
match '/books/:book_id/chapters' => 'projects#chapters' 

第一种方法(将所有内容都放在一个ProjectController

更多信息位于Rails Guide on Routing

编辑(OP):

我使用了你的答案并做了一个小小的变体:

resources :projects do
  member do
    get 'books', to: 'projects#books'
    get 'books/:book_id/chapters', to: 'projects#chapters'
    get 'books/:book_id/chapters/:chapter_id/units', to: 'projects#units'
  end
end

将其放在:projects资源中使其更易于管理。