题目
定义RESTful资源路由及HTTP动词对应关系
信息
- 类型:问答
- 难度:⭐
考点
Rails路由配置,RESTful路由,HTTP动词与控制器动作
快速回答
在Rails中,通过resources方法可快速定义RESTful路由:
- 在
config/routes.rb中使用resources :posts - 自动生成7个标准路由:
- 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/PUT
/posts/:id→posts#update - DELETE
/posts/:id→posts#destroy
- GET
原理说明
RESTful路由是Rails的核心设计,遵循资源化(Resource-Oriented)架构原则。通过声明资源,Rails自动映射HTTP动词(GET/POST/PUT/PATCH/DELETE)到控制器的CRUD动作,符合REST设计风格。
代码示例
在config/routes.rb中定义:
Rails.application.routes.draw do
resources :posts # 生成所有7个标准路由
# 限定部分路由
resources :users, only: [:index, :show]
# 嵌套路由示例
resources :articles do
resources :comments, only: [:create]
end
end执行rails routes查看生成的路由:
Prefix Verb URI Pattern Controller#Action
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy最佳实践
- 优先使用
resources而非手动定义路由 - 用
only/except限定必要路由,避免生成无用路由 - 嵌套路由不超过2层(如
posts/comments),深层嵌套改用浅路由(shallow) - 使用
member或collection添加自定义动作:resources :posts do collection { get :search } # /posts/search member { post :like } # /posts/:id/like end
常见错误
- 混淆HTTP动词:用GET提交删除请求(应使用DELETE)
- 路由顺序错误:自定义路由需放在
resources之前(Rails按定义顺序匹配) - 过度嵌套导致URL冗长(如
/a/b/c/d/e) - 忘记
only限定生成多余路由
扩展知识
- 单数资源:
resource :profile(无index,id不在URL中) - 命名空间:
namespace :admin { resources :posts }生成/admin/posts - 路由助手:自动生成如
posts_path、edit_post_path(id)等方法 - 浅路由:
shallow do避免深层嵌套ID重复出现 - API模式:
config.api_only = true时跳过生成HTML相关路由(如new/edit)