概念
metal 裡的 middleware_stack 迴圈執行,metal 之外的東西是附屬品。
一般模組名和同名目錄都是有聯絡的,但 metal 不是,單指的是 metal.rb 這個檔案,它和 metal/ 目錄下的檔案及內容沒有關係。
ActionController::Base 在它基礎之上新增了多個類和模組,這使得功能得到增多,同時在效能上也會有相應損耗。如果你覺得這些功能不是必需的,或者效能的損耗是不可忍受的,你可以直接使用 Metal.
MVC 裡的 C 可以做得很精簡,ActionController::Metal 就是例子。除了提供一個有效的 Rack 介面外,它幾乎沒有任何其它功能。
舉個例子:
ruby
class HelloController < ActionController::Metal def index self.response_body = "Hello World!" end end
在路由裡新增相應程式碼,將請求轉發到剛才的 HelloController#index 進行處理:
ruby
# config/routes.rb get 'hello', to: HelloController.action(:index)
為了讓 Route 能夠很好轉發,action 方法會返回一個有效的 Rack application.
精簡的 ActionController::Base
首先,我們看看 ActionController::Base 引入了哪些模組:
ruby
MODULES = [ AbstractController::Rendering, AbstractController::Translation, AbstractController::AssetPaths, Helpers, UrlFor, Redirecting, ActionView::Layouts, Rendering, Renderers::All, ConditionalGet, EtagWithTemplateDigest, RackDelegation, Caching, MimeResponds, ImplicitRender, StrongParameters, Cookies, Flash, RequestForgeryProtection, ForceSSL, Streaming, DataStreaming, HttpAuthentication::Basic::ControllerMethods, HttpAuthentication::Digest::ControllerMethods, HttpAuthentication::Token::ControllerMethods, AbstractController::Callbacks, Rescue, Instrumentation, ParamsWrapper ] MODULES.each do |mod| include mod end
引入了這麼多模組,雖然方便了使用。但有的模組,我們用不到。所以,浪費了。
其它
-
不反對給 Rails 進行瘦身,但不要盲目,要清楚自己在做什麼。
另外,要清楚的知道各個元件有什麼用,新增是為了什麼,去掉又會有什麼影響。
為什麼能夠連續呼叫,原因:
你看每個 Rack Middleware 的 call 函式的最後一行,是不是都是 @app.call(env)
這說明,它在呼叫下一個 middleware 啊。
它們是一條封閉的連結,一直走下去,最後又會回到開頭處,並且中間只要有一處斷了,那整條鏈子就都 走不通!
順序是:預設是按 use 的順序走下去,但 use 時你也是可以指定的。
Note: @app 和 env 一直在變,但又一直沒變。