---
# System prepended metadata

title: 12th 鐵人賽 Day_06 routes? (2)
tags: [12th 鐵人賽]

---

---
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)
