📅  最后修改于: 2020-10-20 05:21:21             🧑  作者: Mango
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://///
诸如http://www.example.com/book/update/20之类的URL调用BooksController类(控制器)中的update方法(操作),并将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
路由具有优先级,该优先级由route.rb文件中路由的出现顺序定义。优先级从上到下。
该文件中的最后一条路由的优先级最低,将最后应用。如果没有路由匹配,则返回404。
您可以根据需要更改默认路由。在以下示例中,我们将按以下方式交换控制器和动作–
# Install the default route as the lowest priority.
map.connect ':action/:controller/:id'
现在,要从给定的控制器调用动作,您将必须按如下所示编写URL-
http://localhost:3000/action/controller/id
按照这种顺序放置动作和控制器并不是特别合乎逻辑。最好使用原始默认路由(默认默认路由)。
‘ante-default’路由如下所示-
map.connect ':controller/:action/:id.:format'
最后的。:format与id字段后的字面量点和通配符“ format”值匹配。这意味着它将匹配例如这样的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。如果未指定索引,则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'
现在,您可以在控制器或视图中使用它,如下所示:
在这里,您没有列出要链接的:controller和:action ,而是在路径名后加上_url。您的用户不会注意到任何区别。命名路由仅仅是Rails开发人员保存某些类型的便利。上面的情况可以不用以下命名路由来编写-
'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
要获取有关Routes的更多详细信息,请通过ActionController :: Routing。