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" }
分享到:
相关推荐
让你知道在rails中如何使用路由,路由与URL是如何对应的。
routing-filter 包裹了 Rails 路由系统的复杂野兽,在 Rails URL 识别和生成中提供了看不见的灵活性和强大功能 路由过滤器围绕着复杂的野兽,Rails 路由系统在 Rails URL 识别和生成中提供了看不见的灵活性和强大...
本文发布Ruby on Rails路由拒绝服务漏洞,指出它影响到的系统、不受它影响的系统以及提供给用户厂商补丁下载的地址。
路由过滤器 路由过滤器围绕着Rails路由系统所要面对的复杂的野兽,以实现Rails URL识别和生成中看不见的灵活性和强大功能。 尽管Rails的路由功能强大而强大,但是当您需要以稍微离开Rails约定铺平道路的方式来设计...
在 iOS RestKit+CDQ 项目中轻松使用 Rails 路由和模式。 安装 将此行添加到应用程序的 Gemfile 中: gem 'restikle' 然后执行: $ bundle 或者自己安装: $ gem install restikle 注意:非常初步的发布 这是...
主要介绍了关于Ruby on Rails路由配置的一些建议,作者提出了相关代码编写时一些值得注意的地方,需要的朋友可以参考下
Annotate - 注释Rails类模式和路由信息
将 Grape API 路由装入 Rails 后,Grape API 路由通常不会打印在rake routes或/rails/info/routes 。 这个 gem 将 Grape 的路由打印功能添加到 Rails 中。 用法 将此行添加到您的Gemfile gem 'grape-rails-routes...
主要特点遵循Ruby on Rails路由约定的URL构建在前端和API之间交换数据时,自动将camelCase转换为snake_case并返回至camelCase安装npm install --save rails-ranger 要么yarn add rails-ranger入门如果您喜欢博客文章...
版本化的Rails Routes向Rails路由DSL添加了version方法。 这将“路由”扩展为将肯定的路由匹配结果限制为仅请求HTTP动词/路径组合,该请求还包括的Accept标头。 路由将匹配等于或小于所请求版本的任何所请求版本...
自述文件docker-compose运行web rails new。 -d mysql --skip-bundle docker-compose构建一...compose exec Web Rails路由(用于检查路由) docker-compose exec web rails g控制器控制器名称(用于创建控制器)在安装g
从路由开始: 当您第一次运行 rails server 命令时,我们会看到一般的 rails 页面。 然而,如果我们环顾我们的应用程序,已经有一个对应于 home 的静态页面的视图 (app/views/pages/home.html.erb)。 我们的第一个...
《Rails之道》按照Rails的各个子系统进行组织编排,分别介绍了Rails的环境、初始过程、配置和日志记录,Rails的分配器、控制器、页面生成和路由,REST、资源和Rails,ActiveRecord的基础、关联、验证和高级技巧,...
通道数目的该Rails引擎增加了在应用程序中搜索Ruby on Rails路由的不同属性的能力。 例如,一个内部(或非常宽松的外部)API现在可以公开一个页面,该页面将回答一些简单的问题,例如: “ /users/clear_password...
Rails路由 Active Storage上载文件 在Rails应用程序中使用Bootstrap,Devise,Kaminari gem 技术栈 后端: Ruby2.4 Rails 5.2.x 数据库:Postgres 9.6 宝石:Devise,Kaminari,Bootstrap 前端: HTML,CSS,...
提供一个DSL,以对您的路由文件中的API进行版本控制,从而支持客户端标头而不是更改资源URL。 提供在目录文件中缓存和检索资源的方法,以防止文件混乱 提供一个生成器,以在继承先前版本的同时将您的API控制器扩展...
: : 来自Routes的JS从您的Rails路由生成路径帮助程序和API方法,从而使您的工作效率更高,并防止发生与路由相关的错误。 由于代码生成是完全可定制的,因此可以在非常不同的场景中使用。为什么? :thinking_face: ...
它具有依赖关系的Rails核心组件,例如ActiveRecord,ActionController,Rails路由引擎等。 Ruby版本支持 随着Ruby 1.9.3在2015年初进入维护期末,支持Ruby 1.9.3的Shortener gem的最新版本为0.4.x。 Shortener