不同於靜態網頁,路由是直接對應於檔案的目錄結構,一個Web開發框架會將路由功能納入其中,來獲得最大的彈性。也就是可以指定任意URL對應到任一個Controller的Action,避免在View裡面用字串來把路徑與網址寫死。
如同上圖,路由可根據瀏覽器發出的請求找到對應的Controller執行一連串動作
譬如Rails收到以下請求時,會先找出Controller是哪個
GET /patients/17
由路由器即可取得匹配的Controller
get '/patients/:id', to: 'patients#show'
得知要分配給Controller的show後,即分配給其處理,且將參數id=17傳送過去
Generating Paths and URLs from Code
承上例子,若是想產生路徑與網址可用以下方式
get '/patients/:id', to: 'patients#show', as: 'patient'
view包含以下程式碼
@patient = Patient.find(17)
Controller包含以下程式碼
<%= link_to 'Patient Record', patient_path(@patient) %>
patient_path(@patient) 便會產生路徑 /patients/17,這邊需注意,使用路由的輔助方法(patient_path)時不需要指定id.
Resource Routing: the Rails Default
在Rails裡,資源式路由提供 HTTP動詞、URI Pattern、Controller#Action,這三者的對應關係。按照慣例,每個動作會對應到資料庫特定的 CRUD 操作。假設路由檔案裡有一條路由宣告為:
resources :photos
則會建立出七筆不同的路由,皆對應到 PhotosController
Defining Multiple Resources at the Same Time
若要同時定義多筆資源可以
resources :photos, :books, :videos
此定義等同
resources :photos resources :books resources :videos
Singular Resources
某些情況下會僅需要顯示單筆資源,例如,使用者登入時僅需要顯示一筆資料,此時毋須要ID便可顯示,即僅 /profile就可對應到 show 動作而不是 /profile/:id
以下為單筆路由的產生方式
resource :geocoder
產生的路由如下
Controller Namespaces and Routing
有時可能會想把一些 Controllers 放在同個命名空間下管理。常見的情況是想把 Controller 放在 Admin:: 命名空間下。首先將這些 Controllers 搬到 app/controllers/admin 資料夾底下,接著在路由裡宣告
namespace :admin do resources :articles, :comments end
會給 Articles和Comments這兩個Controllers 在 Admin:: 命名空間下建出路由。比如 Admin::ArticlesController
Rails會產出的路由如下