Rails学习之路由设置(URI映射)

URL的映射规则,在config/routes.rb文件中。这是一个ruby类,不是配置文件。

设置默认主页的映射,例子:

map.root :controller => "home"

这表示网站的主页的控制器为home,action为index。当然还要把public下的index.html移出或改下名字。

 

map.connect 'book/:bookid',:controller=>'book',action=>'show'

匹配路径

http://localhost:3000/book/1

 

上面:controller和:action是绑定的,当一个URL匹配到这个路由信息时,他就把请求定位到指定的控制器和动作上。在控制器中使用params[:bookid]可以取得id的值1

 从此规则中生成URL则如下例子:

<%= link_to "book1",:controller=>"book",:action=>"show",:bookid=>1  %>

:controller的book和:action的show回到上面路由规则。生成的连接如上。

book/:bookid 中book是一个静态的字符串,而:bookid是一个通配符。当有人访问book/bookid的路径时就会转到对应的控制器。link_to 调用中,其参数符合以上路由信息的匹配,所有就以此路由信息为蓝本生成了URL。

 

默认的路由信息

map.connect ':controller/:action/:id'

这个理由信息包含三个接收器,controller,action,id

如:http://localhost:3000/book/show/1,则会对应到控制器book,动作show,参数id值为1。可以看出这和上面的http://localhost:3000/book/1访问的是相同的控制器和动作,并且参数也相同。所获得的返回结果自然也相同。

在此处的:id,为控制器中可以取得的参数.

 

如果修改默认的路由信息

如:map.connect ':action/:controller/:id'

则生成及访问的路由为:http://localhost:3000/show/book/1

 

编写自己的路由规则

map.connect ":id" ,:controller=>"book",:action=>"show"

可以识别如下URL

http://localhost:3000/1,系统将:id设置为1,然后运行控制器book以及动作show。

 

map.connect "mybook/:id" :controller=>"book",:action=>"delete"

识别URL

http://localhost:3000/mybook/1

同时<%= link_to "book1",:controller=>"book",:action=>"delete",:id=>1  %>则会生成上面的URL

 

有一个疑问,如果URL是http://localhost:3000/mybook/a呢?会不会匹配到上面的规则呢?

答案是当然会,可是我们的id是个数字,如果传进来一个字符岂不是有点乱套。怎么才能只让数字的id匹配呢?

使用正则表达式
map.connect "mybook/:id" ,id=>/\d+/,:controller=>"book",:action=>"delete"

或者map.connect "mybook/:id" ,:controller=>"book",:action=>"delete",:requirements=>{:id=>/\d+/}

这样我们的路由规则就只对id为数字的URL生效了

 

创建具名路由

具名路由的具体方法是使用名字调用映射对象方法,并用它取代通常的连接

如:

map.books 'books',:controller=>"book",:action=>"show_all"

在这个例子中可以得到,books_url和books_path两个方法,这两个方法可以再URL和URL组件中使用,不同之处是url生成完整的路径,而path则只是路径的一部分(可以任务是相对路径)

如:<%= link_to "全部","books_url" %>则生成<a href=http://localhost:3000/books>全部</a>。当点击连接后,控制器book的show_all方法会被调用。

 

特殊的范围方法 with_options

观察以下具名路由

map.help "/help",:controller=>"home",:action=>"help"

map.contact "/contact",:controller=>"home",:action=>"contact"

map.about "/about",:controller=>"home",:action=>"about"

可以使用以下具名路由替代

map.with_options  :controller=>"home" do |h|

h.help "/help",:action=>"help"

h.contact "/contact",:action="/contace"

h.about "/about",:action=>"about"

end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值