iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
自我挑戰組

關於 Ruby on Rails 的那些事系列 第 10

Day 10 - Q:你怎麼找到我的? A:Routes 告訴我了。

發現很喜歡拿學生當例子,畢竟學生時期總是很希望趕快變成大人賺錢,做自己想做的事,現在只想回到學生身份,不為五斗米折腰的日子。人會長大,過去的已經回不去了,但是可以回憶...

憶當年才剛入學,除了系上的課,還有通識課要修滿學分,但是學校通識課不知道有哪些課可以選修,於是來到行政大樓,問了工讀生要去哪裡得到課程列表,他說到 3 樓學務處OO組就行了,而我也確實拿到列表。

時光飛逝,終於畢業了,拿到畢業證書的我希望可以終身學習,繼續使用圖書館的資源,所以我又來找工讀生詢問怎麼提出相關申請,他說要準備學生證到 2 樓校友中心的OO組申請校友證,因為要核對學號才能換發,之後就可以出示校友證進入圖書館。

故事中工讀生的角色就很像是 Route,告訴我應該要去幾樓找誰,而後順著指引的路徑取得我想要的資源。

*resources

昨天提到的資源就是在config/routes.rb設定,而rails預設會長出 8 條路徑,路徑搭配 HTTP 動詞方法,可以達到你想要做的事,新增、讀取、編輯、刪除某篇文章、查看文章列表都可以。

# config/routes.rb
Rails.application.routes.draw do
  resources :articles
end


上面的箭頭表示,相同的路徑使用不同的方法就可以操作資源。有些必須帶 ID 有些不用帶 ID,原因很簡單,像老師想查詢某個學生的成績,必須輸入該學生的學號,這個學號就是 ID,可以調出他個人的成績。而今天只是想看這個班級有哪些學生,不用輸入學號就看到整個列表。還有一個情況不需要 ID,還未入學的孩子就沒有學號,直到他一入學的那一瞬間才有學號可以查詢學生資料。也就是說在 create 前是沒有 ID 的,等到儲存的瞬間才會寫入資料庫,同時給這筆資料專屬的 ID。

*resource

不要懷疑,你沒有看錯,剛剛的小標是複數,這裡的小標是單數。

  • 單數的路徑不會生成 index 也就是列表頁
  • 不會做出含有 :id 的路徑

什麼時候會需要這樣的設計呢?
像是會員系統就不會使用到 id,因為你不會需要看到別人的資料,更不會編輯、刪除他人的檔案。(除非是最高權限者、管理員的角色)

# config/routes.rb
Rails.application.routes.draw do
  resource :user
end

備註:

  • 巢狀設計,比方說網址 /user/1/articles,表示 1 號使用者所有的文章!
  • rails 預設的 8 條路徑太多時,可以用 onlyexcept 長出需要的路徑就好~
  • 相反的,路徑太少不夠用呢?
    • member (含有:id)
    • collection (不含:id)
      例如:文章收藏 /articles/2/favorite
    # config/routes.rb
    Rails.application.routes.draw do
      resources :article do
        member do
          get :favorites
          post :favorites
          # 因為不是 rails 預設的路徑,要記得加上 HTTP 動詞
        end
      end
    end
    

參考資料:
為你自己學Ruby on Rails

學無止盡,每天都要進步一點點!


上一篇
Day 9 - 淺談 REST and RESTful
下一篇
Day 11 - MVC 大架構
系列文
關於 Ruby on Rails 的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言