iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 27
0
Modern Web

Ruby on Rails面試題挑戰系列 第 27

Ruby on Rails面試題挑戰 Day27 - Rack是什麼?

What is Rack?
Rack是什麼?


Rack給Ruby相關的網路應用程式開發,提供了一個小型、模組化、容易串接的介面。

它將HTTP的請求和回應盡可能簡單的包裝起來,給網路框架(Rails/Sinatra等等)、伺服器和中間的程式(也就是Middleware)提供了統一的API接口,也就是call方法。

Rack介面的規格是需要提供一個可以回應call方法的Ruby物件,這個物件接受環境變數為參數,call方法會回傳一個陣列,包含下面三個值:

  1. HTTP狀態
  2. HTTP Header
  3. HTTP Body

簡單來說Rack是一個介面,幫助你的Ruby相關開發框架(Rails/Sinatra)與伺服器溝通。

在Rack還沒出現之前,所有的Ruby網路開發框架都有自己的介面,這樣導致很難寫出網站伺服器同時給他們使用,也沒辦法在不同框架中共享程式碼。而現在所有的Ruby網站框架都使用Rack,包括Rails和Sinatra。

##動手寫Rack
如果電腦有安裝完Ruby,我們可以使用rakeup這個指令來建立一個簡單的Rack應用程式,而使用rakeup這個指令需要一個設定檔config.ru,隨意建立一個資料夾,然後開啟編輯器建立config.ru這個檔案,ru就是rackup的縮寫,而內容簡單如下:

# config.ru
class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

run HelloWorld.new

這個檔案符合了Rack的規格,我們建立一個Class產生一個物件,這個物件可以回應call方法,回傳有HTTP狀態、Header、Body這三個值的陣列,我們就可以在終端機以rackup來執行,應該會看到以下

Puma starting in single mode...
* Version 4.3.5 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://127.0.0.1:9292
* Listening on tcp://[::1]:9292
Use Ctrl-C to stop

這時去localhost:9292 這個網址,就可以看到 Hello world!的字樣。

而其實Rails也是一個Rack的應用程式,查查看Rails裡面一定也有config.ru這個檔案,內容大概是長這樣

# This file is used by Rack-based servers to start the application.

require_relative 'config/environment'

run Rails.application

我們可以猜到的是Rails.application應該是一個物件,可以回應call方法,並回傳HTTP狀態、Header、Body。

Rails.application是一個Rails應用程式的主要Rack物件,任何與 Rack 相容的 Web 伺服器,都應該使用Rails.application物件來執行 Rails 應用程式。

我們所一直使用的Rails,其實就是一個大型的Rack應用程式!

你可以這樣回答:

Rack是一個介面,幫助你的Ruby相關開發框架(Rails/Sinatra)與伺服器溝通。而它的規格是提供一個可以回應call方法的Ruby物件,這個物件接受環境變數為參數,call方法會回傳一個陣列,包含下面三個值:

  1. HTTP狀態
  2. HTTP Header
  3. HTTP Body

而我們所使用的Rails或Sinatra其實都是一個大型複雜的Rack應用程式。

參考資料

1.Rails on Rack

2.Rack, a modular Ruby webserver interface

3.為你自己學 Ruby on Rails - Rack 應用程式

  1. [Ruby] Rack — Ruby 框架與 Web Server 的翻譯員

  2. 53 Ruby on Rails Interview Questions and Answers


上一篇
Ruby on Rails面試題挑戰 Day26 - Gemfile和Gemfile.lock是什麼?
下一篇
Ruby on Rails面試題挑戰 Day28 - 字串(String)、符號(Symbol)、變數(Variable)的差異是什麼?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言