加強的 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/