Ruby On Rails 路由配置简述

Stella981
• 阅读 718

转自http://my.oschina.net/VincentJiang/blog/170543

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)))'

默认路由由’/'分割为3部分,第一部分解释为控制器,第二部分解释为Action方法,第三部分变为相应参数传递。

例如,当有”http://domain.com/users/show/1″请求发生时,Rails去请求users控制器的show方法,并将id=1传递给show方法。

3、资源路由 RESTful Routes

资源路由是Rails用来描述资源及其状态的,通俗些,就是用来描述数据库表/实体的相关数据操作。

值的注意的是,资源路由巧妙的使用了HTTP响应,完成了数据库CRUD操作。例如:

resources :users

 

这样就产生了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 方法的路径 ;

5、嵌套路由 Nested Routes

嵌套路由是用于声明一个资源包含另一个关联资源的访问方式。例如:博客系统的文章和评论两个资源就可以这样描述,因为评论应依附于文章存在,不应独立出来。于是便有:

# 直观的写法
resources :articles do
  resources :comments
end
# 更简单的写法
resources :articles, :has_many => :comments

于是,当我们http://domain.com/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://domain.com/users/search/1/25,便会匹配成功;而http://domain.com/users/search/1/60,则不会被匹配。

7、路由优先级

在Rails中,路由生效的优先级是:从routes.rb文件定义的路由中从上到下依次匹配,最早匹配的路由会生效。也就是说routes.rb文件中的路由优先级从上到下依次降低。

PS:当没有任何路由匹配到时,Rails会抛出Routing Error异常。

8、查看当前应用路由规则

查看当前路由规则时,只需Terminal进入项目目录,运行下述命令即可:

rake routes
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这