
攝影師:ThisIsEngineering,連結:Pexels
哈囉,我們又見面了,今天我們來看看:「使用 Ruby on Rails 框架時,怎麼開出前後端分離的 Web API 給前端做串接呢?」,切ki奧~
Ruby on Rails 框架的架構首先簡單介紹一下 Ruby on Rails (簡稱 Rails) 的架構,Rails 是一個實踐 MVC Pattern(Model-View-Controller Pattern) 的框架,對 MVC 不熟的捧油們可以參考 Model、View、Controller 三分天下 | 為你自己學 Ruby on Rails,也就是說 Model(資料格式)、View(顯示資料)、Controller(資料邏輯) 在 Rails 中,是會被強制分開來執行的,好處是各自分工明確,對於熟悉 MVC 架構的人來說,開發上不易混淆;壞處是對於不熟悉 MVC 架構的人來說,一開始就面對超多的資料夾根本是天書,如果你還沒看過 Rails 的新專案長怎樣,現在就讓你看看:

只要一行指令,$ rails new {your-project-name},Rails 就會幫你把整個專案建好,就長上圖的最左邊這樣,什麼事都還沒做,就已經一堆檔案了,你如果沒有先瞭解 MVC 是什麼,看到這些檔案一定相當傻眼。
我們把最常使用的資料夾拿出來看,就是 app/ 和 config/ 這兩個資料夾,兩個資料夾展開來,又是一堆檔案,往 app/ 資料夾裡面仔細一看,會看到熟悉的名字: models、views、controllers,但我們今天只會用到 app/controllers/events_controller.rb 和 config/routes.rb 這兩個檔案就夠了。
Web API 呢?講到 Web API 就必須先講到現代軟體開發的趨勢「前後端分離」,可以參考 [原來後端要知道] 什麼是前後端分離? #前端後端是什麼 #軟體發展歷程 #軟體開發思維。
Rails 開 Web API 呢?對於筆者來說,認識一個新框架時,最重要的就是知道怎麼利用框架來開 Web API,至少能開出 GET 和 POST 兩種,還要能收 request body 帶進來的資料。
阿對了,在開始寫 Rails Web API 之前,你要先安裝 Rails 和 建專案,可以參考 安裝 Rails 開發環境 | Ruby on Rails 實戰聖經 和 Rails 起步走 | Ruby on Rails 實戰聖經。
config/routes.rb 新增兩筆 routing 規則Rails.application.routes.draw do
	# 開一個 GET /hello 的 API,並且對應到 EventController 的 index() method
	get '/hello' => 'events#index'
	# 開一個 POST /hello 的 API,並且對應到 EventController 的 create() method
	post '/hello' => 'events#create'
end
所以透過上面的設定,你就可以對 {your_host}/hello/ 丟 request 囉,但我們現在還沒有寫下收到 request 之後的動作:=> 'events#index' 這段程式,就是告訴 Rails 說:「只要是 /hello 的 request 都去 events_controller.rb 的 index() method 去找對應的動作」;同理,=> 'events#create' 這段就是要找 events_controller.rb 的 create() method 囉,那麼事不宜遲,我們馬上來 events_controller.rb,寫下我們想要這兩個 requests 要做的事。
app/controllers/events_controller.rb 新增 EventController class 和 index()、create() methods貼心提醒,這個
events_controller.rb預設是不會自動產生的哦,需要自己建立這個檔案。
class EventsController < ApplicationController
	# 這個 index() method,就是 GET 127.0.0.1:3000/hello/ 所對應到的動作
	# 我們可以在這裡,把資料庫的資料撈出來,並 response 回給使用者
	# 但目前我們只簡單回個字串,做個 Hello World 即可 ~
	def index
		# response with json format
		respond_to do |format|
			format.json { render :json => { :status => "OK" }, status => 200 }
		end
	end
	# 這個 create() method,就是 POST 127.0.0.1:3000/hello/ 所對應到的動作
	# 這邊示範把 POST request 內的 body 所夾帶的資料拿出來,並且再 response 回給使用者
	def create
		# parse POST request body
		@content = JSON.parse(request.raw_post)['data']
		# 我待會兒會在 Postman 夾帶叫做 data 的測試字串
		# response with json format
		respond_to do |format|
			format.json { render :json => { :status => "OK", :content => @content }, 
										status => 200 }
		end
	end
end
Rails server 跑起來 !在本地端做測試的話,可以直接執行下面這行
$ rails server
=> Booting Puma
=> Rails 6.0.3.1 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.5 (ruby 2.6.3-p62), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
* Listening on tcp://[::1]:3000
Use Ctrl-C to stop
在 Rails 中,預設是開 3000 ports,所以當你執行上面這行之後,就可以用瀏覽器到 127.0.0.1:3000/ 看到 Rails Hello World 的畫面囉,但因為目前我們新增的是 Web API,無法用瀏覽器來測試,所以我們需要借用到 Postman 幫我們丟 request。

Web API 有沒有開成功 !?先來測測 GET 127.0.0.1:3000/hello/ 這支 API,如果你的 Rails Web API 有開成功,就會得到你剛剛在 events_controller.rb 中 index() method 的回應字串。

再來測測 POST 127.0.0.1:3000/hello/,記得你的 request body 放什麼名字(我這邊叫做 data),events_controller.rb 的 create() method,就要跟著改(所以在 create() 的 JSON.parse 就要解析 data)。

接觸一個新框架後,先寫一支傳接資料的 Web API,已經變成筆者的習慣,就像是學新語言都要先印出 Hello World 一樣,不寫不能安心 XD。
筆者目前因為工作的關係,現在開始學習 Ruby on Rails,之後可以期待更多的 Rails 文章和後端文章囉 ~ (希望之後下班後還能有精神繼續寫作哈哈)
我是 RS,這是我的 不做怎麼知道系列 文章,我們 下次見。
xDD
感覺你工作需要的語言滿多元的欸加油
沒有拉,之前 po PHP 是要找工作考試用的XD
現在寫 Rails 是新工作上需要的
小菜鳥要重新出發了哈哈