侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

解释Rails中的资源路由(resourceful routing)并举例说明

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

题目

解释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而非手动定义路由
  • 使用onlyexcept限定生成的路由:
    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_tolink_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可列出所有路由