iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
Modern Web

一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列系列 第 16

Day 16 - 進入Rails世界必須懂:Routes (上)

  • 分享至 

  • xImage
  •  

前面講到 Restful Routes 設計很重要,今天就來簡單講一下基本的路徑Routes設定吧!

路徑設定位置

通常我們會在 config/routes.rb 的檔案裡面進行路徑的設定:

Rails.application.routes.draw do
  get "/", to: "pages#index" #去首頁
  get "/about", to: "pages#about" #去關於我們的頁面
  # 動作 “路徑”, to: "controller#action"
end

一般設定就如上面這樣,會先指定動作,再來是要去的路徑,接著是對應的 controller,"#"後面是 controller 上面的 action。

用 resources 產生的 Routes

這邊可以感受到慣例優於設定的一個小地方,使用 Rails 提供的 resources 方法非常方便,可以自動產生出對應的8條路徑、7種 action,可以應付一般 restful routes 設計

Rails.application.routes.draw do
  resources :articles
end

可以開啟終端機輸入 rails routes -c articles
就會看到對應出來下面的這些路徑

$ rails routes -c articles
   Prefix    Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy

可以注意到我們這些路徑預設的action都是有意義的,一般來說會如下面的設計:

  • index => get,首頁或列表頁,通常會是呈現所有資料的頁面,以文章來說可能就像是部落格的文章列表,或是一些論壇的文章列表頁
  • create => post,為新增文章的位置,不會看到畫面,但是用post動作更新資料
  • new => get,為新增的表單頁面,填入跟文章相關的資料,按下送出就會觸發create
  • edit => get,為編輯的表單頁面
  • show => get,為顯示文章內容的頁面
  • update => patch and put,為更新的位置,不會看到畫面,用patch或put (對瀏覽器來說同樣為post)
  • destroy => delete,為刪除文章的位置,同樣不看到畫面,用delete方法 (同樣為post的一種)

prefix是?

後面可以接上 _path_url 後變成「相對應的路徑或網址」的 View Helper(幫忙view呈現資料的方法)。如果是站內連結,通常會使用 _path 寫法來產生站內的路徑,例如:

articles + path = articles_path => /articles
new_article + path = new_article_path => /articles/new
edit_article + path = edit_article_path(5) => /articles/5/edit

如果是使用 _url 則會產生完整的路徑,包括主機網域名稱:

articles + url = articles_url => http://sean_blog.com/articles
new_article + url = new_article_url => http://sean_blog.com/articles/new
edit_article + url = edit_article_url(5) => http://sean_blog.com/articles/5/edit

如果用不到那麼多種方法

假設我們只需要用到 index 跟 show 呢?
可以使用 onlyexcept ,only 是正向表示,表示內有的方法都要; except 反向表示除了提到的方法之外都要

Rails.application.routes.draw do
  resources :articles, only:[:index, :show]
  resources :articles, except:[:new, :create, :edit, :update, :destroy]
end

resource 用單數會?

如果用單數resource方法會產生沒有id的路徑,如果沒有要表示特定文章路徑就可以用這樣去產生,然後可以搭配only或except去選出那些路徑要用。

Rails.application.routes.draw do
  resource :articles
end
$ rails routes -c articles
      Prefix Verb   URI Pattern              Controller#Action
 new_articles GET    /articles/new(.:format)  articles#new
edit_articles GET    /articles/edit(.:format) articles#edit
     articles GET    /articles(.:format)      articles#show
              PATCH  /articles(.:format)      articles#update
              PUT    /articles(.:format)      articles#update
              DELETE /articles(.:format)      articles#destroy
              POST   /articles(.:format)      articles#create

下一篇再提供多一些關於路徑的設定部分給大家。


參考資料:

  1. 為你自己學 Ruby on Rails
  2. Rails Guide

上一篇
Day 15 - 進入Rails世界必須懂:REST 和 Restful
下一篇
Day 17 - 進入Rails世界必須懂:Routes (下)
系列文
一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言