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/photosphotos#index显示所有文章
GET/photos/newphotos#new显示新建文章的表单
POST/photosphotos#create新建文章
GET/photos/:idphotos#show显示指定的文章
GET/photos/:id/editphotos#edit显示编辑文章的表单
PATCH/PUT/photos/:idphotos#update更新指定的文章
DELETE/photos/:idphotos#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 关联问题:查询未正确进行(单数与复数?)

ruby Ruby on Rails:常见路由

Ruby on Rails 复数模型名称

如何在应用程序级别加密 ruby​​ on rails 中的完整路由

Ruby on Rails 路由到控制器

Ruby on Rails:延迟的作业无法使用邮件程序并给出路由错误