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

In Rails, how do I nest custom routes?

我有 3 个资源。

ProjectsBooks是many_to_many到ProjectBooksBookshave_manyChapters,belong_to Books.

我可以轻松地为 /projects/1/books/2 以及 /chapters/3 设置基本路线。

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

因此,我的路线应该是:

我最初的想法是在 ProjectsController 上使用 books 方法自定义路由。路由:

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,它实际上列出了所有书籍,并且让我无法在 a 的上下文中获取 #chapters项目。

我如何应对双重挑战:

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

编辑:

我的假设是只有 ProjectsController 可以发现哪些 Books 是这个项目的一部分,当然只有 ProjectsController 知道如何添加 Project 特定的数据,例如统计数据。如果我的假设是错误的,并且有不同的方式来构造它,那么一切都是为了它。

这是一个想法:

你可以做类似

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 资源中使其更易于管理。