侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

定义RESTful资源路由及HTTP动词对应关系

2025-12-12 / 0 评论 / 4 阅读

题目

定义RESTful资源路由及HTTP动词对应关系

信息

  • 类型:问答
  • 难度:⭐

考点

Rails路由配置,RESTful路由,HTTP动词与控制器动作

快速回答

在Rails中,通过resources方法可快速定义RESTful路由:

  • config/routes.rb中使用resources :posts
  • 自动生成7个标准路由:
    • GET /postsposts#index
    • GET /posts/newposts#new
    • POST /postsposts#create
    • GET /posts/:idposts#show
    • GET /posts/:id/editposts#edit
    • PATCH/PUT /posts/:idposts#update
    • DELETE /posts/:idposts#destroy
## 解析

原理说明

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)
  • 使用membercollection添加自定义动作:
    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_pathedit_post_path(id)等方法
  • 浅路由shallow do避免深层嵌套ID重复出现
  • API模式config.api_only = true时跳过生成HTML相关路由(如new/edit)