`
mike.gao
  • 浏览: 46598 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

rails 路由

阅读更多
4 正则路由
Rails支持正则路由——是把URLs映射到控制器和方法上。可以应用程序中使用RESTful路由和正则路由两种风格。建议多使用RESTful风格,因为这更容易编写和阅读。

4.1 Bound Parameters
设置正则路由的时候,:controller映射控制器的名称,:action映射方法的名称。例如默认的Rails路由:
map.connect ':controller/:action/:id'
如果请求是/photos/show/1,就会和这个路由做相当的匹配,就会是调用Photos控制器中的show方法,并把这个:id传入params[:id]。

4.2 通配符组件
如果你愿意,可以设置很多的通配符号:
map.connect ':controller/:action/:id/:user_id'
请求的URL是/photos/show/1/2,就会调用Photos控制器中的show方法,params[:id]就设为1,params[:user_id]就设为2。

4.3 静态文本
当创建一个路由时,可以指定一个静态的文本,例如:
map.connect ":controller/:action/:id/with_user/:user_id"
应答的路径就像这样/photos/show/1/with_user/2

4.4 Querystring参数
Rails路由在params哈希中自动选出querystring参数。例如:
map.connect ':controller/:action/:id'
/photos/show/1?user_id=2这个路径进来,就会分配Photos控制器的show方法来处理,params[:id]设为1,params[:user_id]设为2。

4.5 定义默认值
给:controller和:action设定默认值:
map.connect 'photos/:id', :controller => 'photos', :action='show'
就样可以匹配这样的路径:/photos/12

还可以使用:defaults选项:
map.connect 'photos/:id', :controller => 'photos', :action => 'show', :defaults => { :format => 'jpg' }
就同样匹配这样的路径:/photos/12,并且params[:format]设为jpg。

4.6 命名路由
命名路由就不使用connect方法了,可以使用其他的名称来创建一个命名路由。例如:
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
这个路会做两件事,首先,/logout请求将被发送给Sessions控制器的destroy方法。Rails会生成logout_path和logout_url辅助方法。

4.7 路由需求
使用:requirements选项为路由参数指定一种格式:
map.connect 'photo/:id', :controller => 'photos', :action => 'show', :requirements => { :id => /[A-Z]\d{5}/ }
这个路由应答像/photo/A12345这样的URLs。也可以简写:
map.connect 'photo/:id', :controller => 'photos', :action => 'show', :id => /[A-Z]\d{5}/

4.8 路由条件
可以用:conditions选项来约束路由,现在来约束:method:
map.connect 'photo/:id', :controller => 'photos', :action => 'show', :conditions => {:method => :get}
在RESTful路由使用:conditions,可以具体指定:get, :post, :put, :delete, 或者 :any给:method。

4.9 路由通配符
路由通配符是一种指定一个详细的参数去匹配路由剩余部分的方法。例如:
map.connect 'photo/*other', :controller => 'photos', :action => 'unknow'
这个路由会匹配photo/12或者/photo/long/path/to/12,并且为params[:other]创建一个数组。

4.10 路由选项
使用:with_options把相似路由分成一组:
map.with_options :controller => 'photo' do |photo|
photo.list '', :action => 'index'
photo.delete ':id/delte', :action => 'delete'
photo.edit ':id/edit', :action => 'edit'
end


5 格式和respond_to
使用:format参数让路由可以根据不同的HTTP请求格式做不同的处理:
map.connect ':controller/:action/:id.:fromat'
匹配/photo/edit/1.xml或者/poto/show/2.rss。在控制器的方法中,能够对不同的请求作出应答:
respond_to do |format|
format.html
format.xml {render :xml => @photo.to_xml}
end

5.1 用Http Header指定格式
如作没有:format参数,Rails将自动认为是HTTP Accept格式。

5.2 元类型
默认情况下,Rails能对html, text, json, csv, xml, rss, atom和yaml做出应答。如果还需要其他类型,可以在环境中注册它:
Mime::Type.register "image/jpg", :jpg


6 默认路由
当创建一个Rails应用时,routes.rb就会自动生成两个默认路由:
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
如果你不使用RESTful风格的路由,这个路由为很多URLs就提供了合理的默认值。

7 空路由
不要和默认路由混淆,空路由有它明确的目的:为web站点指定根路径。以example.com为例,以http://example.com或者http://example/来请求,就会由空路由来匹配。

7.1 使用map.root
使用map.root设定空路由:
map.root :controller => 'pages', :action => 'main'使用root方法,是告诉Rails就是请求站点的根路径。

为了更方便阅读, 可以指定一个已经创建好的路由给map.root:
map.index 'index', :controller => 'pages', :action => 'main'
map.root :index

由于是从上至下处理文件,所以必须在调用map.root指定命名路由。

7.2 连接空字符串
也可以使用连接空字符串来指定空路由:
map.connect '', :controller => "pages", :action => "main"

假若指定了空路由,但发现它好像并没有工作,首页还是Rails的默认页面,那么请删除public/index.html文档后再试。

8 检查和测试路由
在应用程序中,路由不应该是个黑盒子,它对你是永远开放的。Rails为检查和测试路由提供了内建的工具。

8.1 用rake查看存的路由
在应用程序中,如果想查看路由列表,可以运行rake routes。它会列出你在routes.rb定义的全部路由。
users GET /users          {:controller=>"users", :action=>"index"}
formatted_users GET /users.:format {:controller=>"users", :action=>"index"}
POST /users          {:controller=>"users", :action=>"create"}
POST /users.:format {:controller=>"users", :action=>"create"}

8.2 测试路由
Rails内建了三个断言来做路由测式
·assert_generates
·assert_recognizes
·assert_routing

8.2.1 assert_generates
使用assert_generates断言一个设置选项生成的特定路径。
assert_generates "/photos/1", { :controller => "photos", :action => "show", :id => "1" }
assert_generates "/about", :controller => "pages", :action => "about"
还可以提供:method参数:

8.2.2 assert_recognizes
assert_recognizes断言反转的assert_generates。在应用程序中它断言Rails认可的给定的路径和路由到一个特定的位置。
assert_recognizes { :controller => "photos", :action => "show", :id => "1" }, "/photos/1"
可以使用:method参数:
assert_recognizes { :controller => "photos", :action => "create" }, { :path => "photos", :method => :post }
能够使用RESTful辅方法测试RESTful路由:
assert_recognizes new_photo_url, { :path => "photos", :method => :post }

8.2.3 assert_routing
assert_routing是断言检测路径生成选项和选项生成路径,它是assert_generates和assert_recognizes的联合:
assert_routing { :path => "photos", :method => :post }, { :controller => "photos", :action => "create" }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics