Ruby on rails 实战圣经:Routing 路由
2013-11-25 07:00
651 查看
Weeks of programming cansave you hours of planning. – Unknown
不同于PHP的路由系统是直接对应于档案的目录结构,一个Web开发框架会将路由功能纳入其中,来获得最大的弹性。也就是您可以指定任意URL对应到任一个Controller的Action。另一方面,我们也不在Views中直接写死URL网址,而是透过Helper辅助方法根据你的路由设定来产生URL。
也就是,路由系统做几件事情:
1. 辨识HTTP Request的URL网址,然后对应到设定的Controller Action。
2. 处理网址内的参数字串,例如:/users/show/123送到Users controller的show action时,会将
3. 辨识link_to和redirect_to的参数产生URL字符串,例如
会产生
Rails这么弹性的路由功能,可以怎么用呢?例如设计一个博客网站,如果是没有框架的PHP网页开发,会长得这样:
但是如果我们想要将编号放在网址列中呢?
或是希望根据日期:
或者是根据不同作者加上文章的卷标(将关键词放在网址中有助于SEO):
这些在Rails只需要修改config/routes.rb这一个路由档案,就可以完全自由自定。让我们看看有哪些设定方式吧:
这是我们在上一章所使用的方式,也是Rails 3.0之前版本的默认方式。其中的括号用法表示可有可无,也就是上述这一行设定就包括六种路径方式:
例如,像这样的网址
这里的
注意到在routes.rb中,越上面越优先。是如果有网址同时符合多个规则,会使用最上面的规则。
其中
虽然RESTful已经是设计Rails最常见的路径模式,但是在一些特殊的情况、不符合CRUD模型的情结就不一定适用了,例如有多重步骤的窗体(又叫作Wizard) 时,使用命名路由反而会比较简洁,例如
记得也要删除public/index.html这个档案
或是
另外也可以限定IP位置:
特别之处在于那就没有index action了,所有的URL Helper也皆为单数形式,显示出来的网址也是单数。
但是Singular resource的档案命名仍为复数,例如maps_controller.rb
如此产生的URL Helper如
实务上不建议设计超过两层
如此便会有
如此会有
如此原先的URL Helper就会变成如
如果您对这些进阶的设定不知道如何用起,没关系我们在进阶RESTful一章将提供完整的程序范例。
这样就会产生出所有URL Helper、URL 网址和对应的Controller Action都列出来。
http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/
http://www.railsdispatch.com/posts/rails-routing
不同于PHP的路由系统是直接对应于档案的目录结构,一个Web开发框架会将路由功能纳入其中,来获得最大的弹性。也就是您可以指定任意URL对应到任一个Controller的Action。另一方面,我们也不在Views中直接写死URL网址,而是透过Helper辅助方法根据你的路由设定来产生URL。
也就是,路由系统做几件事情:
1. 辨识HTTP Request的URL网址,然后对应到设定的Controller Action。
2. 处理网址内的参数字串,例如:/users/show/123送到Users controller的show action时,会将
params[:id]设定为123
3. 辨识link_to和redirect_to的参数产生URL字符串,例如
[code]link_to 'hola!', { :controller=> 'welcome', :action => 'say' }[/code]
会产生
[code]<a href="/welcome/say">hola!</a>[/code]
Rails这么弹性的路由功能,可以怎么用呢?例如设计一个博客网站,如果是没有框架的PHP网页开发,会长得这样:
[code]http://example.org/?p=123[/code]
但是如果我们想要将编号放在网址列中呢?
[code]http://example.org/posts/123[/code]
或是希望根据日期:
[code]http://example.org/posts/2011/04/21/[/code]
或者是根据不同作者加上文章的卷标(将关键词放在网址中有助于SEO):
[code]http://example.org/ihower/posts/123-ruby-on-rails[/code]
这些在Rails只需要修改config/routes.rb这一个路由档案,就可以完全自由自定。让我们看看有哪些设定方式吧:
典型路由
[code]match '/:controller(/:action(/:id))(.format)'[/code]
这是我们在上一章所使用的方式,也是Rails 3.0之前版本的默认方式。其中的括号用法表示可有可无,也就是上述这一行设定就包括六种路径方式:
match '/:controller'
match '/:controller/:action'
match '/:controller/:action/:id'
match '/:controller.:format'
match '/:controller/:action.:format'
[code]match '/:controller/:action/:id.:format'[/code]
例如,像这样的网址
http://localhost:3000/welcome/say便会对应到welcome controller的say action。典型路由是一种非常简便的对应方式。这种方式的缺点当网站的Action变多的时候,会容易让Controller的设计变得混乱没有规则。稍后介绍的RESTful路由则是Rails对此提出的组织路由方案。
一般路径RegularRoutes
[code]match 'meetings/:id', :to => 'events#show'[/code]
这里的
events#show表示指向events controller的show action。通常会简写成:
[code]match 'meetings/:id' => 'events#show'[/code]
注意到在routes.rb中,越上面越优先。是如果有网址同时符合多个规则,会使用最上面的规则。
命名路由NamedRoutes
Named Routes可以帮助我们产生URL helper如meetings_url或
meetings_path,而不需要用
{:controller => 'meetings', :action => 'index'}的方式:
[code]match '/meetings' => 'events#index', :as => "meetings"[/code]
其中
:as的部份就会产生一个
meetings_path和
meetings_url的Helpers,
_path和
_url的差别在于前者是相对路径,后者是绝对路径。一般来说比较常用
_path方法,除非像是在Email信件中,才必须用
_url提供包含Domain的完整网址。
虽然RESTful已经是设计Rails最常见的路径模式,但是在一些特殊的情况、不符合CRUD模型的情结就不一定适用了,例如有多重步骤的窗体(又叫作Wizard) 时,使用命名路由反而会比较简洁,例如
step1_path, step2_path, step3_path等。
设定首页
要设定网站的首页,请设定:[code]root :to => 'welcome#show'[/code]
记得也要删除public/index.html这个档案
HTTP动词(Verb)限定
可以透过 :via 参数指定 HTTP Verb 动词match "account/overview" => "account#overview", :via => "get"
[code]match "account/setup" => "account#setup", :via => [:get, :post][/code]
或是
get "account/overview" => "account#overview"
get "account/setup" => "account#setup"
[code]post "account/setup" => "account#setup"[/code]
特殊条件限定
我们可以利用:constraints设定一些参数限制,例如限制
:id必须是整数。
[code]match "/events/show/:id" => "events#show", :constraints => {:id => /\d/}[/code]
另外也可以限定IP位置:
constraints(:ip => /(^127.0.0.1$)|(^192.168.[0-9]{1,3}.[0-9]{1,3}$)/) do
match "/events/show/:id" => "events#show"
[code]end[/code]
RESTful路由
我们在第六章介绍过RESTful路由的来龙去脉,接下来仔细看看其中的设定。复数资源
[code]resources :events[/code]
单数资源Singular Resoruce
除了一般复数型Resources,在单数的使用情境下也可以设定成单数Resource:[code]resource :map[/code]
特别之处在于那就没有index action了,所有的URL Helper也皆为单数形式,显示出来的网址也是单数。
但是Singular resource的档案命名仍为复数,例如maps_controller.rb
套迭Nested Resources
当一个Resource一定会依存另一个Resource时,我们可以套迭多层的Resources,例如以下是任务一定属于在项目底下:resources :projects do
resources :tasks, :people
[code]end[/code]
如此产生的URL Helper如
project_tasks_path(@project)和
project_task_path(@project, @task),它的网址会如projects/123/tasks和projects/123/tasks/123。
实务上不建议设计超过两层
自定群集路由Collection
除了惯例中的七个Actions外,如果你需要自定群集的Action,可以这样设定:resources :products do
collection do
get :sold
post :on_offer
end
[code]end[/code]
如此便会有
sold_products_path和
on_offer_products_path这两个URL Helper,产生出如products/sold和products/on_offer这样的网址。
自定特定元素路由Member
如果需要自定对特定元素的Action:resources :products do
get :sold, :on => :member
[code]end[/code]
如此会有
sold_product_path(@product)这个URL Helper,产生出如products/123/sold这样的网址。
领域名Namespace
我们可以在URL网址前多加一段,特别适合例如后台接口:namespace :admin do
resources :projects
[code]end[/code]
如此原先的URL Helper就会变成如
admin_projects_path这样的形式。
如果您对这些进阶的设定不知道如何用起,没关系我们在进阶RESTful一章将提供完整的程序范例。
rake routes
如果你不清楚这些路由设定到底最后的规则是什么,你可以执行:[code]rake routes[/code]
这样就会产生出所有URL Helper、URL 网址和对应的Controller Action都列出来。
结论
透过RESTful和Named Route,我们就不再需要透过典型路由的Hash来指定路由了。所有的路由规则都可以在routes.rb一目了然。在线参考数据
http://guides.rubyonrails.org/routing.htmlhttp://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/
http://www.railsdispatch.com/posts/rails-routing
相关文章推荐
- Ruby on rails 实战圣经:Part 1: 入门导览->Ruby on Rails 简介
- [Ruby on Rails实战圣经]Ajax 应用程式
- Ruby on rails 实战圣经:数据库迁移 - Migrations
- Ruby on rails 实战圣经:Part 2: 深度剖析环境设定与Bundler
- Ruby on rails 实战圣经:RESTful 应用程序
- Ruby on rails 实战圣经:ActiveRecord
- Ruby on rails 实战圣经:Rails起步走
- Ruby on rails 实战圣经:Ruby程序语言入门
- Ruby on rails 实战圣经:ActionController
- Ruby on rails 实战圣经:安装Rails开发环境
- [Ruby On Rails] Rails 路由学习笔记
- Ruby on Rails真枪实战《第1招》
- Ruby On Rails系列从入门到精通实战教程 Ruby基础教程下载
- ruby on rails揭开route路由的真面目
- Ruby On Rails系列从入门到精通实战教程 Ruby基础教程下载
- Ruby on Rails 路由解析
- [ruby on rails] 跟我学之(4)路由映射