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

如果您收到“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类(控制器)中的更新方法(操作) ,并将id参数设置为值 20。

如果没有指定其他控制器,以下代码块会将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

现在,您可以使用图书控制器中的所有编辑方法来编辑 ID 为 20 的图书,如下所示 -

http://localhost:3000/2

路由优先级

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

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

修改默认路由

您可以根据您的要求更改默认路由。在下面的示例中,我们将交换控制器操作,如下所示 -

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

现在,要从给定的控制器调用操作,您必须按如下方式编写 URL -

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

按这样的顺序放置操作控制器并不是特别合乎逻辑。原来的default(默认默认)路由比较好,推荐。

违约前路线

“ante-default”路由如下所示 -

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

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

http://localhost:3000/book/show/3.xml

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

空荡荡的路线

空路由与默认路由相反。在新生成的routes.rb 文件中,空路由被注释掉,因为它没有通用或合理的默认值。您需要决定这个URL 应该为您编写的每个应用程序执行什么操作。

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

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

这是上述规则的解释 -

  • 第一个将在主控制器内搜索欢迎操作,即使您只输入http://localhost:3000。

  • 最后一个将连接到 http://localhost:3000/main/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。例如 -

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'}
# http://localhost:3000/articles/2005/11/06

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