在Rails中,如何嵌套自定义路由?
In Rails, how do I nest custom routes?
我有 3 个资源。
Projects
Books
Chapters
Projects
和Books
是many_to_many到ProjectBooks
,Books
have_manyChapters
,belong_to Books
.
我可以轻松地为 /projects/1
和 /books/2
以及 /chapters/3
设置基本路线。
如何仅列出附加到给定项目的 Books
?如何添加与 Project
相关的那些 Books
的信息?
因此,我的路线应该是:
/books/2
- 显示书 2
/projects/1
- 显示项目 1
/projects/1/books
- 列出项目 1 中的书籍和其他信息
/projects/1/books/2/chapters
- 关于第 2 本书中与项目 1 相关的章节的信息
我最初的想法是在 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
项目。
我如何应对双重挑战:
Books
可以独立列出,但也可以在 Project
的上下文中列出
- 在
Project
的上下文中列出时添加特定信息
编辑:
我的假设是只有 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
资源中使其更易于管理。
我有 3 个资源。
Projects
Books
Chapters
Projects
和Books
是many_to_many到ProjectBooks
,Books
have_manyChapters
,belong_to Books
.
我可以轻松地为 /projects/1
和 /books/2
以及 /chapters/3
设置基本路线。
如何仅列出附加到给定项目的 Books
?如何添加与 Project
相关的那些 Books
的信息?
因此,我的路线应该是:
/books/2
- 显示书 2/projects/1
- 显示项目 1/projects/1/books
- 列出项目 1 中的书籍和其他信息/projects/1/books/2/chapters
- 关于第 2 本书中与项目 1 相关的章节的信息
我最初的想法是在 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
项目。
我如何应对双重挑战:
Books
可以独立列出,但也可以在Project
的上下文中列出
- 在
Project
的上下文中列出时添加特定信息
编辑:
我的假设是只有 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
资源中使其更易于管理。