Ruby on Rails 路由解析
Posted 袁慎建@ThoughtWorks
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby on Rails 路由解析相关的知识,希望对你有一定的参考价值。
为了更好的阅读体验,欢迎访问 作者博客原文
Route是什么
Rails中URL的约定严格基于RESTful
风格的。客户端的请求其实是在操作一些资源,同一资源的不同的请求动作(GET
, POST
, PUT
, PATCH
, DELETE
)分别对资源进行不同的操作(CRUD)。默认的情况下,我们只需要在routes.rb文件中配置好资源,Rails会为该资源生成7种不同的路由,根据路由就可以将客户端的请求转交给服务端对应的控制器进行处理,然后做出正确的响应。Rails Route能识别这种资源式(RESTful
风格)的路由以及非资源式的路由,它是客户端请求和服务端控制器的粘合剂,能将URL分发给控制器进行处理。
Rails路由有啥用
Rails路由主要有两个作用,首先作为客户端请求和服务端控制器的粘合剂,它负责分发请求,链接URL和Controller。另一个主要作用是动态生成路径和URL。
把URL与代码链接起来
请求GET /articles/17
对应的路由是
get '/articles/:id', to: 'articles#show',
- 这个请求就会被交给
articles
控制器中的show
动作处理,并把id: '17'
传入params
动态生成路径和URL
get '/articles/:id', to: 'articles#show', as: 'article'
在控制器中有
@article = Article.find(17)
视图中有
<%= link_to 'Article Record', article_path(@patient) %>
会生成路径/articles/17
。
提示
路由是按照顺序定匹配的,一旦匹配成功就会寻找对应的控制器动作。
资源式路由
使用资源路径可以快速声明资源式控制器所有的常规路由,无需分别为 index、show、new、edit、create、update 和 destroy 动作分别声明路由,只需一行代码就能搞定
添加一个资源
我们在routes.rb文件中添加一个资源photos
Rails.application.routes.draw do
resources :photos
end
运行$ rake routes
可以查看生成的路由
$ rake routes
Prefix Verb URI Pattern Controller#Action
photos GET /photos(.:format) photos#index
POST /photos(.:format) photos#create
new_photo GET /photos/new(.:format) photos#new
edit_photo GET /photos/:id/edit(.:format) photos#edit
photo GET /photos/:id(.:format) photos#show
PATCH /photos/:id(.:format) photos#update
PUT /photos/:id(.:format) photos#update
DELETE /photos/:id(.:format) photos#destroy
可以看到生成如下7种路由
HTTP 方法 | 路径 | 控制器#动作 | 作用 |
---|---|---|---|
GET | /photos | photos#index | 显示所有文章 |
GET | /photos/new | photos#new | 显示新建文章的表单 |
POST | /photos | photos#create | 新建文章 |
GET | /photos/:id | photos#show | 显示指定的文章 |
GET | /photos/:id/edit | photos#edit | 显示编辑文章的表单 |
PATCH/PUT | /photos/:id | photos#update | 更新指定的文章 |
DELETE | /photos/:id | photos#destroy | 删除指定的文章 |
`
除了生成对应的7种不同的路由,还会生成一些具名辅助方法
photos_path
,返回/photos
new_photo_path
, 返回/photos/new
edit_photo_path(:id)
, 返回/photos/:id/edit
,例如edit_photo_path(10)
返回/photos/10/edit
photo_path(:id)
, 返回/photos/:id
,例如photo_path(10)
返回/photos/10
又来一个资源
实际项目中,我们会有很多资源,需要为他们声明路由可以将多个资源放在一个resources
中声明,这样可以节省一定的时间。
resources :photos, :books, :videos
或者(推荐使用)
resources :photos
resources :books
resources :videos
单数资源路径
我们会有不使用 ID就能查看资源的场景。例如,/profile 一直显示当前登入用户的个人信息。此时,我们可以把 /profile(不是 /profile/:id)映射到 show 动作:
get 'profile', to: 'users#show'
或者使用Symbol
get 'profile', to: :show
同样我们可以配置一个单数资源
resource :geocoder
运行$ rake routes
,会看到生成六种不同的路由
$ rake routes
Prefix Verb URI Pattern Controller#Action
geocoder POST /geocoder(.:format) geocoders#create
new_geocoder GET /geocoder/new(.:format) geocoders#new
edit_geocoder GET /geocoder/edit(.:format) geocoders#edit
GET /geocoder(.:format) geocoders#show
PATCH /geocoder(.:format) geocoders#update
PUT /geocoder(.:format) geocoders#update
DELETE /geocoder(.:format) geocoders#destroy
同样单数资源式路由生成以下帮助方法:
new_geocoder_path
, 返回/geocoder/new
edit_geocoder_path
,返回/geocoder/edit
geocoder_path
, 返回/geocoder
提示
单数资源使用场景不是很多,了解怎么使用即可。
资源嵌套
实际项目中资源通常不是独立存在的,互相有具有一定业务和逻辑关系,比如一对多
,一对一
,多对多
。在rails中,解决一个资源属于另一个资源的子资源的情况,需要使用到资源嵌套
来定义它们的路由。
为了更好的阅读体验,更多内容,欢迎访问 作者博客原文
以上是关于Ruby on Rails 路由解析的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)