在Rails应用程序中,routes.rb 文件管理着全部用户从客户端向服务器发送的请求,该如何转化?routes.rb经过分析URL,来肯定要调用哪一个控制器的哪一个Action方法。 数据库
在routes.rb文件中,共列举了5种主要路由,分别为默认路由(Default Routes)、资源路由(RESTful Routes)、命名路由(Named Routes)、嵌套路由(Nested Routes)、正则路由(Regular Routes)。下面咱们来一一学习之~~ ruby
顾名思义,默认路由是建立应用时,Rails自动生成的,位于routes.rb文件的最后一行。 服务器
match ':controller(/:action(/:id(.:format)))'
默认路由由’/'分割为3部分,第一部分解释为控制器,第二部分解释为Action方法,第三部分变为相应参数传递。 dom
例如,当有”http://domain.com/users/show/1″请求发生时,Rails去请求users控制器的show方法,并将id=1传递给show方法。 学习
资源路由是Rails用来描述资源及其状态的,通俗些,就是用来描述数据库表/实体的相关数据操做。 url
值的注意的是,资源路由巧妙的使用了HTTP响应,完成了数据库CRUD操做。例如: spa
resources :users |
这样就产生了7种不一样的路由,用来描述User的数据库操做。以下表所示: code
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还为资源生成了一些辅助方法: orm
命名路由能够为任意一个肯定的URL定义名称,该名称亦可用在控制器方法中,实现页面提交和重定向。例如: 对象
match 'hello', :to => 'users#index', :as => 'hello'
使用上述代码后,Rails便知道’hello’须要调用users控制器的index方法。同时,还为该路由建立了两个辅助方法:
嵌套路由是用于声明一个资源包含另外一个关联资源的访问方式。例如:博客系统的文章和评论两个资源就能够这样描述,由于评论应依附于文章存在,不该独立出来。因而便有:
# 直观的写法 resources :articles do resources :comments end # 更简单的写法 resources :articles, :has_many => :comments
因而,当咱们http://domain.com/articles/1/comments请求资源时,rails会理解为获取id=1的那篇文章的全部评论。很直观,有木有?
正则路由的使用几率较低,但它却能完成很是严谨的路由访问。它能够为每一个可变参数经行正则验证,只有经过验证的url,才会被指定到定义好的控制器方法中去。简单举个例子:
match 'users/search/:id/:age', :controller => 'users', :action => 'search', :age => /[2-5][0-9]/
上面的路由只有在age参数传递在20-59之间时才会被匹配,如http://domain.com/users/search/1/25,便会匹配成功;而http://domain.com/users/search/1/60,则不会被匹配。
在Rails中,路由生效的优先级是:从routes.rb文件定义的路由中从上到下依次匹配,最先匹配的路由会生效。也就是说routes.rb文件中的路由优先级从上到下依次下降。
PS:当没有任何路由匹配到时,Rails会抛出Routing Error异常。
查看当前路由规则时,只需Terminal进入项目目录,运行下述命令便可:
rake routes