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组成,而:action又接收一些:id

如果您收到对“https://127.0.0.1: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 的 book,如下所示:

https://127.0.0.1:3000/2

路由优先级

路由的优先级由路由在 routes.rb 文件中出现的顺序定义。优先级从上到下。

该文件中的最后一个路由优先级最低,将最后应用。如果没有任何路由匹配,则返回 404。

修改默认路由

您可以根据您的需求更改默认路由。在以下示例中,我们将交换controlleraction,如下所示:

# Install the default route as the lowest priority.
map.connect ':action/:controller/:id'

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

https://127.0.0.1:3000/action/controller/id

actioncontroller按这种顺序排列并不是特别符合逻辑。原始默认(默认的默认)路由更好,建议使用。

前默认路由

“前默认”路由如下所示:

map.connect ':controller/:action/:id.:format'

末尾的 .:format 匹配一个文字点和 id 字段后面的通配符“format”值。这意味着它将匹配例如这样的 URL:

https://127.0.0.1:3000/book/show/3.xml

在这里,在控制器操作内部,您的params[:format]将设置为 xml。

空路由

空路由有点像默认路由的反面。在新生成的 routes.rb 文件中,空路由被注释掉了,因为没有通用的或合理的默认值。您需要为编写的每个应用程序决定此nothing URL 应该做什么。

以下是一些相当常见的空路由规则示例:

map.connect '', :controller => "main", :action => "welcome"
map.connect '', :controller => "main"

以下是上述规则的解释:

  • 第一个将在主控制器内部搜索 welcome 操作,即使您只键入https://127.0.0.1:3000

  • 最后一个将连接到 https://127.0.0.1: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}/

# Using the route above, the url below maps to:
# params = {:year => '2005', :month => '11', :day => '06'}
# https://127.0.0.1:3000/articles/2005/11/06

要获取有关路由的更多详细信息,请参阅ActionController::Routing。

广告