Rails Routing from the Outside In(1)

不同於靜態網頁,路由是直接對應於檔案的目錄結構,一個Web開發框架會將路由功能納入其中,來獲得最大的彈性。也就是可以指定任意URL對應到任一個Controller的Action,避免在View裡面用字串來把路徑與網址寫死。

mvc

如同上圖,路由可根據瀏覽器發出的請求找到對應的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
螢幕快照 2017-11-01 上午12.07.08

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

產生的路由如下

螢幕快照 2017-11-02 下午11.52.11

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會產出的路由如下

螢幕快照 2017-11-05 下午11.16.10

發表留言