Ruby on Rails - 路由
Ruby on Rails - 路由
Section titled “Ruby on Rails - 路由”Rails 路由器(router)定义在 config/routes.rb 文件中,负责识别 URL 并将其分派到控制器的动作(action)。它还可以生成路径(paths)和 URL,避免在视图(views)和控制器(controllers)中硬编码字符串。
可以把路由(routes)看作是传入请求的地图。当一个请求到达时,路由器会查阅这张地图来确定请求应该去哪里。
Rails.application.routes.draw do # 模式 1 将 URL 映射到 controller#action1 # 模式 2 将另一个 URL 映射到 controller#action2 # ...end使用 resources 定义 RESTful 路由
Section titled “使用 resources 定义 RESTful 路由”在 Rails 中定义路由最常见的方式是使用 resources。这个助手方法(helper)为一个给定的资源(resource)(例如 books, articles)声明标准的 RESTful 路由。
对于我们使用 BooksController 的图书应用,我们可以使用以下方式,而不是手动定义每条路由:
Rails.application.routes.draw do resources :books # ... 其他路由 ...end这行简单的代码 resources :books 会自动创建以下路由:
- HTTP 方法 | 路径 | 控制器#动作 | 命名助手方法
- ------------|------------------|---------------------|-----------------
- GET | /books | books#index |
books_path - POST | /books | books#create |
books_path - GET | /books/new | books#new |
new_book_path - GET | /books/:id/edit | books#edit |
edit_book_path(@book) - GET | /books/:id | books#show |
book_path(@book) - PATCH/PUT | /books/:id | books#update |
book_path(@book) - DELETE | /books/:id | books#destroy |
book_path(@book)
这些命名助手方法(named helpers)(如 books_path、new_book_path)是您在控制器(controllers)和视图(views)中使用的(例如 link_to 'New Book', new_book_path)。
定义单个路由
Section titled “定义单个路由”虽然对于 CRUD 操作,推荐使用 resources,但您可能需要定义自定义路由(custom routes)。下面是原始示例中的路由如何更明确地定义的方式(尽管使用 resources :books 更好):
Rails.application.routes.draw do get 'books', to: 'books#index', as: 'book_list' # 如果不使用 resources,也可以简单写 'books' get 'books/new', to: 'books#new', as: 'new_book_form' post 'books', to: 'books#create' # 用于创建新图书
get 'books/:id', to: 'books#show', as: 'show_book' get 'books/:id/edit', to: 'books#edit', as: 'edit_book_form' patch 'books/:id', to: 'books#update' put 'books/:id', to: 'books#update' # 也常用于更新
delete 'books/:id', to: 'books#destroy', as: 'delete_book'
# 自定义动作示例,例如 'show_subjects' # 这可能作为嵌套资源或放在 SubjectsController 中更好 # get 'subjects/:id/books', to: 'books#show_subject_books', as: 'subject_books' get 'books_by_subject/:subject_id', to: 'books#index', as: 'books_by_subject' # 如果用于过滤 index 列表endget 'books'将 GET 请求映射到/books,对应BooksController的index动作(action)。as: 'book_list'创建命名助手方法book_list_path和book_list_url。post 'books'将 POST 请求映射到/books(通常来自新图书表单),对应create动作。patch 'books/:id'将 PATCH 请求(通常来自编辑图书表单)映射到特定图书 ID 对应的update动作。delete 'books/:id'将 DELETE 请求映射到destroy动作。
要设置您应用的默认页面(例如当用户访问 http://localhost:3000/ 时),您可以定义一个根路由(root route):
Rails.application.routes.draw do root 'books#index' # 使图书 index 页面成为应用根目录 resources :books # ...end要查看应用中定义的所有路由,您可以在终端(terminal)中使用 rails routes 命令:
$ rails routes此命令会列出所有路由,包括它们的 HTTP 方法、URI 模式、控制器#动作 以及命名助手方法。它对于调试路由问题或理解应用的 URL 结构非常有用。
最佳实践:对于标准的 CRUD 接口,优先使用 resources。对于自定义动作或非 RESTful 接口,使用单独的路由定义。保持 routes.rb 文件整洁有序。
深入阅读:有关更高级的路由技术,如嵌套资源(nesting resources)、成员/集合路由(member/collection routes)和约束(constraints),请参考官方的 Rails Routing Guide:[https://guides.rubyonrails.org/routing.html](https://guides.rubyrb onrails.org/routing.html)
下一步是什么?
Section titled “下一步是什么?”有了处理请求的控制器和指引流量的路由,下一步是创建视图,向用户呈现数据并允许他们与应用交互。