Ruby on Rails的路由

路由就是用户输入URL地址,后端服务器能找到对应的处理程序。在Ruby on Rails中,我理解的路由(Route)主要和两件事情相关,一是将URL和http动作(Verb)映射到后端的控制器(Controller)对应的动作(Action);二是页面返回时,需要将Rails 视图(Views)中常用的帮助方法(Helper)转换成路径(Path)或URL。

路由的映射配置在config/routes.rb,我们可以在命令行输入bin/rake 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
about GET /about(.:format) pages#about

这张表格中的四列就包含了之前所说的两层含义,通过URI Pattern和Verb动作就可以对应到后端处理的Controller#Action,比如GET “/posts/new” 就对应于PostController中的new方法,而最前面的前缀new_post则采用的是命名路由方式,表示可以在视图.erb模板文件中使用new_post_path或new_post_url的帮助方法,来生成相应的URL地址,path是相对路径,url则是绝对路径。

在config/routes.rb中设置路由最简单直接的方法就是key/value形式,指定Http Verb和URI Pattern映射到对应的方法,也可以是静态页面,比如:


root "posts#index"
get '/about', to: 'pages#about'

root相当于get ‘/‘就是映射到app/controllers/posts_controller.rb中的PostsController类的index方法,而get ‘/about’则是对应到app/views/pages/about.html.erb页面模板文件。

这个写法虽然直接,但会对一个资源(Resource)的增删改查来说写起来就繁琐了,往往会采用RESTful的形式。一个Resource有一堆的动作,index, show, new, edit, create, update和destroy, 基本的写法就是:


resources :posts

这就生成了前面例子中有关Post的index, show, new, edit, create, update和destroy所有路由信息了。路由使用 HTTP 方法和 URL 匹配请求,把四个 URL结合不同的HTTP方法映射到七个不同的动作上。

REST有主要有两个核心精神,参见RESTful 應用程式

  • 使用Resource来当做识别的资源,也就是使用一个URL网址來代表一个Resource。
  • 同一个Resource则可以有不同的Representations格式变化。

再解释一下bin/rake routes输出信息中的格式,:id是传入参数,可以通过params[:id]获得;(.format)则说明可以让路由接受.json、.xml等有扩展名的网址,并且转成params[:format]参数传入Controller里,搭配respond_to而回传不同的格式。

基本的就是这样,具体路由为了简化书写,还有resource的嵌套,as别名,module/namespace/member/collection/scope多种组合形态,还可以用except/only做七个预设资源路由的限制,这个慢慢用到时再了解。

参考文档:

0/88x31.png" />
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。