--- title: 12th 鐵人賽 Day_06 routes? (2) tags: 12th 鐵人賽 --- # 12th 鐵人賽 Day_06 routes? (2) 嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,有請今天鎮文圖! ![](https://i.imgur.com/D11zRX4.jpg) (羅賓超美的啦!) 咳!昨天我們說到了 rails 裡面的 routes 設計,不過使用的都是單複數 resource(s) 的方式,而用這樣的方式所製作出來的路徑是固定的([依循REST principles 的 RESTful 的路徑](https://ihower.tw/blog/archives/1542))。 但專案總是有許多需求,若我不想使用預設的那些路徑呢? ## 簡單路徑的設定法 我們可以使用`get "路徑", to "controller#action"`,這個方式來指定輸入什麼網址後要交由哪一個controller的action: ```ruby= Rails.application.routes.draw do get "/home", to: "pages#index" end ``` 上面第2行的意思是,當使用者輸入`/home`這個網址後,會交由pages controller裡的index這個action做處理。 (其實還有很多變化,詳情請看[為你自己學Ruby on Rails](https://railsbook.tw/chapters/11-routes.html)) ## 巢狀路徑的設定法 若是 rails 內建的路徑不夠用,我們可以使用collection、member、shallow,來新增我們要的路徑 ### collection 若想要看到所有已被認證的官方使用者(像Facebook或Instagram的藍勾勾),此時不需要指定使用者的編號這時就可以使用 collection 來處理 : ```ruby= Rails.application.routes.draw do resources :users do collection do get :confirmed end end end ``` 此時路徑會有: ![](https://i.imgur.com/RNZImn1.png) 若不想用block,也可以寫成: ```ruby= Rails.application.routes.draw do resources :users do get :confirmed, on: :collection end end ``` 效果一樣。(若想新增的路徑不只一條,還是用 block 比較好。) ### member 若想列出3號使用者正在追蹤的人,那網址的設計可能是這樣: `/users/2/following`,必須要先指定 user 的編號(id),此時就可以用 member 來處理: ```ruby= Rails.application.routes.draw do resources :users do member do get :following end end end ``` 此時的路徑會有: ![](https://i.imgur.com/91lCBqX.png) 這個時候會發現多了一條following的路徑,而且是由 users controller 裡的 following 這個 action 處理的,並需要指定 user 的編號,一樣可以不用 block 寫: ```ruby= Rails.application.routes.draw do resources :users do get :following, on: :member end end ``` ### shallow 若今天只想做出的路徑,有些需要指定使用者編號,有些不需要,我們可以用only 或 except 來做處理。 ```ruby= Rails.application.routes.draw do resources :users do recources :post, only: [:index, :new, :create] end resources :posts, except: [:index, :new, :create] #這邊是為了示範,建議都用only或都用except,不然思緒換來換去的,增加閱讀困擾 end ``` 讓我解釋一下上面的code: 通常建立文章的時候,我們會需要指定使用者的編號(這樣才知道是誰的文章),但是當文章建立好後,就不需要了,因為文章本身就有自己的流水編號,指定使用者給他是沒有意義的,而且網址會很長! 這樣的設計是比較合理的,所以 Rails 已經有幫我們建好比較好寫的寫法了: ```ruby= Rails.application.routes.draw do resources :users do resources :posts, shallow: true end end ``` 這樣就可以達到一樣的效果,建立出: 1. users 的八條路徑 2. posts 的 index、new、create 路徑(會需要指定 users id) 3. posts 的剩下五條路徑(直接取用posts的編號) 好的,routes的部份到這裡告一段落,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見! ![](https://i.imgur.com/PPbpd2b.gif) ------ #### 參考文章 [什麼是REST跟RESTful?](https://ihower.tw/blog/archives/1542) [RailsGuides - Routing](https://guides.rubyonrails.org/routing.html) [為你自己學Ruby on Rails](https://railsbook.tw/chapters/11-routes.html)