在一个Rails 应用程序中,进入的请求首先被发送给一个路由组件,该组件判断应该将请求发送到应用程序的什么部分、如何解析这一请求。这一阶段将找出控制器代码中的某个特定方法,要求它来处理请求(用Rails 的行话,这个方法叫做“action”)。action 可以查阅请求中携带的数据,可以与模型交互,也可以调用别的action。最后,action 会为视图准备充分的信息,视图则将所需的信息展现给用户。
Rails的路由是一个双重的机制,它既能将进入服务器的HTTP请求连接到你的controller,也能帮助你(在View内)生成URL,而不需要使用硬编码的字符串。
1. 从URL到代码
2. 从代码到URL
路由也可以反过来作用.如果你的应用包含了以下代码:
@patient = Patient.find(17)
<%= link_to “Patient Record”, patient_path(@patient) %>
那么,路由引擎就会把这段代码解释成这样的URL: http://example.com/patients/17。这样使用路由,比起硬编码URL,可以降低你的应用程序的脆弱程度(增加程序健壮性),并且可以增加代码的可读性,使你的程序更容易被理解。
Rails路由配置文件:routes.rb
在routes.rb文件中,共列举了5种主要路由,分别为默认路由(Default Routes)、资源路由(RESTful Routes)、命名路由(Named Routes)、嵌套路由(Nested Routes)、正则路由(Regular Routes)。
1. 默认路由 Default Routes
默认路由是创建应用时,Rails自动生成的,位于routes.rb文件的最后一行。
match ':controller(/:action(/:id(.:format)))'
默认路由由’/'分割为3部分,第一部分解释为控制器,第二部分解释为Action方法,第三部分变为相应参数传递。
例如,当有”http://domain.com/users/show/1″请求发生时,Rails去请求users控制器的show方法,并将id=1传递给show方法。
2. 资源路由 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 方法的路径 ;
3. 命名路由 Named Routes
命名路由可以为任意一个确定的URL定义名称,该名称亦可用在控制器方法中,实现页面提交和重定向。例如:
match 'hello', :to => 'users#index', :as => 'hello'
使用上述代码后,Rails便知道’hello’需要调用users控制器的index方法。同时,还为该路由创建了两个辅助方法:
hello_path 和 hello_url : 映射了 users#index 方法的路径
4. 嵌套路由 Nested Routes
嵌套路由是用于声明一个资源包含另一个关联资源的访问方式。例如:博客系统的文章和评论两个资源就可以这样描述,因为评论应依附于文章存在,不应独立出来。于是便有:
# 直观的写法
resources :articles do
resources :comments
end
# 更简单的写法
resources :articles, :has_many => :comments
于是,当我们http://domain.com/articles/1/comments请求资源时,rails会理解为获取id=1的那篇文章的所有评论。
5. 正则路由 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,则不会被匹配。
###路由优先级###
在Rails中,路由生效的优先级是:从routes.rb文件定义的路由中从上到下依次匹配,最早匹配的路由会生效。也就是说routes.rb文件中的路由优先级从上到下依次降低。
当没有任何路由匹配到时,Rails会抛出Routing Error异常。
查看当前应用路由规则:rake routes
相关推荐
只需在config/routes/*.rb创建它们就可以了。 安装 将此行添加到您的应用程序的Gemfile中: gem "rails-routes" 然后执行: $ bundle 或自己安装为: $ gem install rails-routes 用法 将这个gem添加到您的项目...
Chapter 4. Perform Fast Queries with Advanced Postgres Indexes Chapter 5. Create Clean Search Results with Bootstrap Components Chapter 6. Build a Dynamic UI with AngularJS Chapter 7. Test This Fancy ...
Pragmatic - Agile.Web.Development.with.Rails.4.Sep.2013.pdf
Rails.4.in.Action.2015.8.pdf英文电子版
agile_web_development_with_rails_3rd_edition.9994652073.pdf
Rails.Recipes.Rails.3.Edition.和源码
rails.macro 一个babel宏,可让JavaScript代码访问Ruby on Rails命名路由 安装 安装 (以及rails.macro )并将其添加到您的babel配置中: npm install --save-dev babel-plugin-macros rails.macro .babelrc : ...
Agile.Web.Development.with.Rails.4.Sam.Ruby
RESTful.Rails.Development.2015.10.pdf
Pragmatic.Security.on.Rails.Dec.2009.rar
Ruby.on.Rails.Enterprise.Application.Development
This concise teaches you how to use the power of Docker and Kubernetes to deploy your Rails applications easily and efficiently. Docker and Kubernetes are increasing in popularity every day, but what ...
Ruby.on.Rails.Tutorial,Learn.Web.Development.with.Rails,Third.Edition-中文版 文字版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
Head.First.Rails中文版.2011.12
Apress.Beginning.Rails.from.Novice.to.Professional.2007.
Wiley.Ruby.on.Rails.Bible.Oct.2008
Build.Your.Own.Ruby.on.Rails.Web.Applications.Feb.2007.pdf
官方推荐的Ruby On Rails书籍,Rails Recipes 2012最新版,英文, 专业ruby程序员必备
Rails.Angular.Postgres.and.Bootstrap.Powerful.Effective.and.Efficient.Full-Stack.Web.Development.2016.1.pdf