天天看點

Metal - 加強的 Rack, 簡陋的 Action Controller

加強的 Rack:

意味着它符合 Rack 接口規範,可以直接使用它,建立出來的應用可以看做是一個 Rack application.

在 Rack 的基礎上,它增加了 middleware_stack 的預處理。

和 Rack 一樣,它的功能真的很有限。如你的項目做為 API 對外提供服務,不需要那麼多功能,你可以嘗試。

和 Rack 一樣,相對來說它的性能比較高。如你的 Rails 項目對性能要求非常高,你可以嘗試。

Rails Metal is a subset of Rack middleware 可以參考【Rack - Ruby Web server 接口】章節了解更多關于 Rack 的内容。

簡陋的 Action Controller:

除了提供一個有效的 Rack 接口外,它幾乎沒有任何其它功能。

ActionController::Base 在它基礎之上添加了多個類和子產品,這使得功能得到增多,同時在性能上也會有相應損耗。如果你覺得這些功能不是必需的,或者性能的損耗是不可忍受的,你可以直接使用 Metal.

舉個例子:

class HelloController < ActionController::Metal
  def index
    self.response_body = "Hello World!"
  end
end
           

在路由裡添加相應代碼,将請求轉發到剛才的 HelloController#index 進行處理:

# config/routes.rb
get 'hello', to: HelloController.action(:index)
           

為了讓 Route 能夠很好轉發,action 方法會傳回一個有效的 Rack application.

主要做的事情

調用 middleware 進行預處理。

像 Rack application 一樣小而完整的處理。

做出響應。

其它

一般子產品名和同名目錄都是有聯系的,但 metal 不是,單指的是 metal.rb 這個檔案,它和 metal/ 目錄下的檔案及内容沒有關系。

  • 直接使用 Metal 時,要清楚自己在做什麼。

另外,要清楚的知道各個元件有什麼用,添加是為了什麼,去掉又會有什麼影響。

  • 為什麼能夠連續調用,原因:

你看每個 Rack Middleware 的 call 函數的最後一行,是不是都是 @app.call(env)

這說明,它在調用下一個 middleware 啊。

它們是一條封閉的連結,一直走下去,最後又會回到開頭處,并且中間隻要有一處斷了,那整條鍊子就都 走不通!

順序是:預設是按 use 的順序走下去,但 use 時你也是可以指定的。

Note: @app 和 env 一直在變,但又一直沒變。

用技術做兼職,找技術兼職,就上:

http://shixian.com/

繼續閱讀