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。

修改默认路由

您可以根据需要更改默认路由。在下面的示例中,我们将按以下方式交换 controlleraction

# 将默认路由安装为最低优先级。
map.connect ':action/:controller/:id'

现在,要从给定的 controller 调用 action,您必须按如下方式编写 URL −

http://localhost:3000/action/controller/id

actioncontroller 按照这样的顺序排列并不是特别合乎逻辑。原始默认(默认默认)路由更好,推荐使用。

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。