题目
解释Rails中的资源路由(resourceful routing)并举例说明
信息
- 类型:问答
- 难度:⭐
考点
路由配置,RESTful设计,CRUD操作映射
快速回答
资源路由是Rails实现RESTful架构的核心机制,通过一行代码自动生成符合REST规范的7个标准路由:
- 将HTTP动词(GET/POST/PUT/PATCH/DELETE)映射到控制器动作
- 自动创建命名路由助手方法(如
posts_path) - 支持标准CRUD操作:index, show, new, create, edit, update, destroy
原理说明
资源路由遵循REST(Representational State Transfer)设计原则,将HTTP动词与控制器动作对应:
- GET → index/show/new/edit
- POST → create
- PUT/PATCH → update
- DELETE → destroy
这种设计使URL结构统一且语义清晰,例如/posts始终表示文章集合,/posts/new表示创建新文章的表单。
代码示例
在config/routes.rb中定义:
# 基本资源路由
resources :posts
# 生成的路由:
# GET /posts → posts#index
# GET /posts/new → posts#new
# POST /posts → posts#create
# GET /posts/:id → posts#show
# GET /posts/:id/edit → posts#edit
# PATCH /posts/:id → posts#update
# PUT /posts/:id → posts#update
# DELETE /posts/:id → posts#destroy视图中使用路由助手:
<%= link_to '查看文章', post_path(@post) %>
<%= button_to '删除', post_path(@post), method: :delete %>最佳实践
- 优先使用
resources而非手动定义路由 - 使用
only或except限定生成的路由:resources :users, only: [:index, :show] - 嵌套路由不超过1层:
resources :authors do
resources :books, shallow: true
end
常见错误
- 混淆
post_path(单数id)和posts_path(复数集合) - 忘记
method指定非GET请求:
错误:<a href="/posts/1" data-method="delete">Delete</a>
正确:使用button_to或link_to+method: - 过度嵌套路由导致URL复杂(如
/authors/1/books/5/chapters/3)
扩展知识
- Member/Collection路由:添加自定义动作
resources :photos do
member { get 'preview' } # /photos/1/preview
collection { post :search } # /photos/search
end - 单数资源:用于无ID的场景(如个人资料)
resource :profile→ 生成/profile而非/profiles/:id - 路由查看命令:
rails routes可列出所有路由