iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

Ruby on Rails 新手的30個問題!系列 第 6

Day_06 routes? (2)

嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,開始之前有請今天的one piece!

(羅賓超美的啦!)

咳!昨天我們說到了 rails 裡面的 routes 設計,不過使用的都是單複數 resource(s) 的方式,而用這樣的方式所製作出來的路徑是固定的(依循REST principles 的 RESTful 的路徑)。

但專案總是有許多需求,若我不想使用預設的那些路徑呢?

簡單路徑的設定法

我們可以使用get "路徑", to "controller#action",這個方式來指定輸入什麼網址後要交由哪一個controller的action:

Rails.application.routes.draw do
  get "/home", to: "pages#index"
end

上面第2行的意思是,當使用者輸入/home這個網址後,會交由pages controller裡的index這個action做處理。
(其實還有很多變化,詳情請看為你自己學Ruby on Rails)

巢狀路徑的設定法

若是 rails 內建的路徑不夠用,我們可以使用collection、member,來新增我們要的路徑

collection

若想要看到所有已被認證的官方使用者(像Facebook或Instagram的藍勾勾),此時不需要指定使用者的編號,這樣的情況就可以使用 collection 來處理 :

Rails.application.routes.draw do
  resources :users do
    collection do
      get :confirmed
    end
  end
end

此時路徑會有:

若不想用block,也可以寫成:

Rails.application.routes.draw do
  resources :users do
    get :confirmed, on: :collection
  end
end

效果一樣。(若想新增的路徑不只一條,還是用 block 比較好。)

member

若想列出3號使用者正在追蹤的人,那網址的設計可能是這樣:
/users/2/following,必須要先指定 user 的編號(id),此時就可以用 member 來處理:

Rails.application.routes.draw do
  resources :users do
    member do
      get :following
    end
  end
end

此時的路徑會有:

這個時候會發現多了一條following的路徑,而且是由 users controller 裡的 following 這個 action 處理的,並需要指定 user 的編號,一樣可以不用 block 寫:

Rails.application.routes.draw do
  resources :users do
    get :following, on: :member
  end
end

指定範圍的設定法

only、except、shallow

若今天只想做出的路徑,有些需要指定使用者編號,有些不需要,我們可以用only 或 except 來做處理。

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 已經有幫我們建好比較好寫的寫法了:

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?
RailsGuides - Routing
為你自己學Ruby on Rails


上一篇
Day_05 routes?
下一篇
Day_07 session ?
系列文
Ruby on Rails 新手的30個問題!30

尚未有邦友留言

立即登入留言