Skip to content

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

在 Rails 中定义路由最常见的方式是使用 resources。这个助手方法(helper)为一个给定的资源(resource)(例如 books, articles)声明标准的 RESTful 路由。

对于我们使用 BooksController 的图书应用,我们可以使用以下方式,而不是手动定义每条路由:

config/routes.rb
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)。

虽然对于 CRUD 操作,推荐使用 resources,但您可能需要定义自定义路由(custom routes)。下面是原始示例中的路由如何更明确地定义的方式(尽管使用 resources :books 更好):

config/routes.rb
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 列表
end
  • get '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):

config/routes.rb
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)

有了处理请求的控制器和指引流量的路由,下一步是创建视图,向用户呈现数据并允许他们与应用交互。