Ruby on Rails 2.1 - 路由系统
Rails 解析 URL 以确定请求的控制器、操作和参数。使用 Rails 路由,URL 的某些部分可以指定其他参数,整个路由过程都由您控制。路由规则在任何 Web 服务器上的工作方式相同。
config/routes.rb 文件是 Rails 路由系统的核心。此文件包含尝试匹配请求的 URL 路径并确定将该请求定向到何处的规则。规则按照文件中定义的顺序进行测试。与请求的 URL 路径匹配的第一个规则决定了该请求的命运。
路由系统实际上做了两件事 −
它将请求映射到控制器内的操作方法。
它为您编写 URL,以用作 link_to、redirect_to 和 form_tag 等方法的参数。
因此,路由系统知道如何将访问者的请求 URL 转换为控制器/操作序列。它还知道如何根据您的规范生成 URL 字符串。
考虑 Rails 在生成应用程序时安装的以下路由 −
map.connect ':controller/:action/:id'
此路由表明它期望请求由 :controller 和 :action 组成,后者又被输入一些 :id。
如果您收到"http://localhost:3000/book/edit/2"的传入请求,则它将按如下方式映射 −
params = { :controller => 'book', :action => 'edit', :id => '2' }
因此,默认路由(如果您不修改路由规则)是 −
http://<base-url>/<controller>/<action>/<id>
像 http://www.example.com/book/update/20 这样的 URL 会调用 BooksController 类(控制器)中的 update 方法(操作),并将 id 参数设置为值 20。
如果没有指定其他控制器,以下代码块将设置 book 为默认控制器。这意味着访问 '/' 将调用 book 控制器。
ActionController::Routing:Routes.draw do |map| map.connect ':controller/:action/:id',:controller => 'book' end
如果给定的 URL 中没有指定任何操作,您还可以定义默认操作 −
ActionController::Routing:Routes.draw do |map| map.connect ':controller/:action/:id', :action => 'edit',:controller => 'book' end
现在,您可以在 book 控制器内编辑所有方法来编辑 ID 为 20 的书籍,如下所示 −
http://localhost:3000/2
路由优先级
路由的优先级由 routes.rb 文件中路由的出现顺序定义。优先级从上到下。
该文件中的最后一个路由优先级最低,将最后应用。如果没有匹配的路由,则返回 404。
修改默认路由
您可以根据需要更改默认路由。在下面的示例中,我们将按以下方式交换 controller 和 action −
# 将默认路由安装为最低优先级。 map.connect ':action/:controller/:id'
现在,要从给定的 controller 调用 action,您必须按如下方式编写 URL −
http://localhost:3000/action/controller/id
将 action 和 controller 按照这样的顺序排列并不是特别合乎逻辑。原始默认(默认默认)路由更好,推荐使用。
Ante-Default 路由
"ante-default"路由如下所示 −
map.connect ':controller/:action/:id.:format'
末尾的 .:format 匹配 id 字段后的文字点和通配符"format"值。这意味着它将匹配例如这样的 URL −
http://localhost:3000/book/show/3.xml
在这里,在控制器操作中,您的 params[:format] 将设置为 xml。
空路由
空路由与默认路由正好相反。在新生成的 routes.rb 文件中,空路由被注释掉,因为没有通用或合理的默认值。您需要决定这个 nothing URL 应该对您编写的每个应用程序做什么。
以下是一些相当常见的空路由规则示例 −
map.connect '', :controller => "main", :action => "welcome" map.connect '', :controller => "main"
以下是上述规则的解释 −
即使您只输入 http://localhost:3000,第一个也会在主控制器内搜索欢迎操作。
最后一个将连接到 http://localhost:3000/main/index。这里 index 是未指定时的默认操作。
Rails 2.0 引入了一个名为 root 的映射器方法,它成为定义 Rails 应用程序空路由的正确方法,如下所示 −
map.root :controller => "homepage"
定义空路由可让人们在仅使用域名连接到您的站点时看到一些内容。
命名路由
在继续开发应用程序时,您可能会在整个应用程序中使用一些链接。例如,您可能经常将链接放回主列表页面。您不必在整个应用程序中添加以下行,而是可以创建一个命名路由,使您能够链接到该链接的简写版本 −
link_to 'Home', :controller => 'classified', :action => 'list'
您可以按如下方式定义命名路由。这里不是使用 connect,而是使用您可以定义的唯一名称。在本例中,该路由称为 home。其余的路由看起来与您创建的其他路由类似。
map.home '', :controller => 'classified', :action => 'list'
现在,您可以在控制器或视图中使用它,如下所示 −
<%= link_to 'Back', home_url %>
在这里,您不是列出要链接到的 :controller 和 :action,而是将路由名称后跟 _url。您的用户不会注意到任何差异。命名路由只是为了方便 Rails 开发人员节省一些输入。上述情况可以在不使用命名路由的情况下编写如下 −
<%= link_to 'Back', {:action => 'list'} %>
漂亮的 URL
路由可以生成漂亮的 URL。例如 −
map.connect 'articles/:year/:month/:day', :controller => 'articles', :action => 'find_by_date', :year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/ # 使用上面的路由,下面的 URL 映射到: # params = {:year => '2005', :month => '11', :day => '06'} # http://localhost:3000/articles/2005/11/06
要获取有关路由的更多详细信息,请浏览 ActionController::Routing。