---
title: 12th 鐵人賽 Day_06 routes? (2)
tags: 12th 鐵人賽
---
# 12th 鐵人賽 Day_06 routes? (2)
嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,有請今天鎮文圖!

(羅賓超美的啦!)
咳!昨天我們說到了 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
```
此時路徑會有:

若不想用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
```
此時的路徑會有:

這個時候會發現多了一條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的部份到這裡告一段落,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!

------
#### 參考文章
[什麼是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)