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://: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://:3000/2

路由優先順序

路由的優先順序由路由在 routes.rb 檔案中出現的順序定義。優先順序從上到下。

該檔案中的最後一個路由優先順序最低,將最後應用。如果沒有任何路由匹配,則返回 404。

修改預設路由

您可以根據您的需求更改預設路由。在以下示例中,我們將交換controlleraction,如下所示:

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

現在,要從給定的controller呼叫action,您需要按如下方式編寫 URL:

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

actioncontroller按這種順序排列並不是特別符合邏輯。原始預設(預設的預設)路由更好,建議使用。

前預設路由

“前預設”路由如下所示:

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

末尾的 .:format 匹配一個文字點和 id 欄位後面的萬用字元“format”值。這意味著它將匹配例如這樣的 URL:

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

在這裡,在控制器操作內部,您的params[:format]將設定為 xml。

空路由

空路由有點像預設路由的反面。在新生成的 routes.rb 檔案中,空路由被註釋掉了,因為沒有通用的或合理的預設值。您需要為編寫的每個應用程式決定此nothing URL 應該做什麼。

以下是一些相當常見的空路由規則示例:

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

以下是上述規則的解釋:

  • 第一個將在主控制器內部搜尋 welcome 操作,即使您只鍵入https://:3000

  • 最後一個將連線到 https://: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://:3000/articles/2005/11/06

要獲取有關路由的更多詳細資訊,請參閱ActionController::Routing。

廣告

© . All rights reserved.