URL的映射规则,在config/routes.rb文件中。这是一个ruby类,不是配置文件。
设置默认主页的映射,例子:
map.root :controller => "home"
这表示网站的主页的控制器为home,action为index。当然还要把public下的index.html移出或改下名字。
map.connect 'book/:bookid',:controller=>'book',action=>'show'
匹配路径
上面: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