1、认识Rails路由配置文件:routes.rb
在Rails应用程序中,routes.rb 文件管理着所有用户从客户端向服务器发送的请求,该如何转化?routes.rb通过分析URL,来确定要调用哪个控制器的哪个Action方法。
在routes.rb文件中,共列举了5种主要路由,分别为默认路由(Default Routes)、资源路由(RESTful Routes)、命名路由(Named Routes)、嵌套路由(Nested Routes)、正则路由(Regular Routes)。下面我们来一一学习之~~
2、默认路由 Default Routes
顾名思义,默认路由是创建应用时,Rails自动生成的,位于routes.rb文件的最后一行。
match ':controller(/:action(/:id(.:format)))'
match '/:controller(/:action(/:id))(.format)'
这是我们在上一章所使用的方式,也是Rails 3.0之前版本的默认方式。其中的括号用法表示可有可无,也就是上述这一行设定就包括六种路径方式:
match '/:controller'
match '/:controller/:action'
match '/:controller/:action/:id'
match '/:controller.:format'
match '/:controller/:action.:format'
match '/:controller/:action/:id.:format'
例如,像这样的网址http://localhost:3000/welcome/say
便会对应到welcome controller的say action。典型路由是一种非常简便的对应方式。这种方式的缺点当网站的Action变多的时候,会容易让Controller的设计变得混乱没有规则。稍后介绍的RESTful路由则是Rails对此提出的组织路由方案。
默认路由由’/'分割为3部分,第一部分解释为控制器,第二部分解释为Action方法,第三部分变为相应参数传递。
例如,当有”http:///users/show/1″请求发生时,Rails去请求users控制器的show方法,并将id=1传递给show方法。
match 'meetings/:id', :to => 'events#show'
这里的events#show
表示指向events controller的show action。通常会简写成:
match 'meetings/:id' => 'events#show'
注意到在routes.rb中,越上面越优先。是如果有网址同时符合多个规则,会使用最上面的规则。
3、资源路由 RESTful Routes
资源路由是Rails用来描述资源及其状态的,通俗些,就是用来描述数据库表/实体的相关数据操作。
值的注意的是,资源路由巧妙的使用了HTTP响应,完成了数据库CRUD操作。例如:
这样就产生了7种不同的路由,用来描述User的数据库操作。如下表所示:
HTTP响应 | URL | Action方法 | 描述 |
---|
GET | /users | index | 获取所有user数据 |
GET | /users/new | new | 跳转到创建user页面 |
POST | /users | create | 创建新的user |
GET | /users/1 | show | 获取id=1的user对象 |
GET | /users/1/edit | edit | 编辑id=1的user对象 |
PUT | /users/1 | update | 更新id=1的user对象 |
DELETE | /users/1 | destroy | 删除id=1的user对象 |
这7中路由完成了资源的所有CRUD操作,与此同时,rails还为资源生成了一些辅助方法:
- users_path : 映射了 index 和 create 方法的路径 ;
- new_user_path : 映射了 new 方法的路径 ;
- edit_user_path : 映射了 edit 方法的路径 ;
- user_path : 映射了 show、update、destroy 方法的路径 ;
4、命名路由 Named Routes
命名路由可以为任意一个确定的URL定义名称,该名称亦可用在控制器方法中,实现页面提交和重定向。例如:
match 'hello', :to => 'users#index', :as => 'hello'
使用上述代码后,Rails便知道’hello’需要调用users控制器的index方法。同时,还为该路由创建了两个辅助方法:
- hello_path 和 hello_url : 映射了 users#index 方法的路径 ;
补充: Named Routes可以帮助我们产生URL helper如meetings_url
或meetings_path
,而不需要用{:controller => 'meetings', :action => 'index'}
的方式:
match '/meetings' => 'events#index', :as => "meetings"
其中:as
的部份就会产生一个meetings_path
和meetings_url
的Helpers,_path
和_url
的差别在于前者是相对路径,后者是绝对路径。一般来说比较常用_path
方法,除非像是在Email信件中,才必须用_url
提供包含Domain的完整网址。
虽然RESTful已经是设计Rails最常见的路径模式,但是在一些特殊的情况、不符合CRUD模型的情结就不一定适用了,例如有多重步骤的窗体(又叫作Wizard) 时,使用命名路由反而会比较简洁,例如step1_path, step2_path, step3_path
等。
HTTP动词(Verb)限定
可以透过 :via 参数指定 HTTP Verb 动词
match "account/overview" => "account#overview", :via => "get"
match "account/setup" => "account#setup", :via => [:get, :post]
或是
get "account/overview" => "account#overview"
get "account/setup" => "account#setup"
post "account/setup" => "account#setup"
我们可以利用:constraints
设定一些参数限制,例如限制:id
必须是整数。
match "/events/show/:id" => "events#show", :constraints => {:id => /\d/}
另外也可以限定IP位置:
constraints(:ip => /(^127.0.0.1$)|(^192.168.[0-9]{1,3}.[0-9]{1,3}$)/) do
match "/events/show/:id" => "events#show"
5、嵌套路由 Nested Routes
嵌套路由是用于声明一个资源包含另一个关联资源的访问方式。例如:博客系统的文章和评论两个资源就可以这样描述,因为评论应依附于文章存在,不应独立出来。于是便有:
resources :articles do
resources :comments
end
resources :articles, :has_many => :comments
resources :projects do
resources :tasks, :people
end
如此产生的URL Helper如project_tasks_path(@project)
和project_task_path(@project, @task)
,它的网址会如projects/123/tasks和projects/123/tasks/123。
实务上不建议设计超过两层
自定群集路由C
于是,当我们http:///articles/1/comments请求资源时,rails会理解为获取id=1的那篇文章的所有评论。很直观,有木有?
6、正则路由 Regular Routes
正则路由的使用概率较低,但它却能完成非常严谨的路由访问。它可以为每个可变参数经行正则验证,只有通过验证的url,才会被指定到定义好的控制器方法中去。简单举个例子:
match 'users/search/:id/:age', :controller => 'users', :action => 'search', :age => /[2-5][0-9]/
上面的路由只有在age参数传递在20-59之间时才会被匹配,如http:///users/search/1/25,便会匹配成功;而http:///users/search/1/60,则不会被匹配。
7、路由优先级
在Rails中,路由生效的优先级是:从routes.rb文件定义的路由中从上到下依次匹配,最早匹配的路由会生效。也就是说routes.rb文件中的路由优先级从上到下依次降低。
PS:当没有任何路由匹配到时,Rails会抛出Routing Error异常。
8、查看当前应用路由规则
查看当前路由规则时,只需Terminal进入项目目录,运行下述命令即可: