Metal - 精簡的 ActionController::Base

概念

metal 裏的 middleware_stack 循環執行,metal 以外的東西是附屬品。ruby

通常模塊名和同名目錄都是有聯繫的,但 metal 不是,單指的是 metal.rb 這個文件,它和 metal/ 目錄下的文件及內容沒有關係。app

ActionController::Base 在它基礎之上添加了多個類和模塊,這使得功能獲得增多,同時在性能上也會有相應損耗。若是你以爲這些功能不是必需的,或者性能的損耗是不可忍受的,你能夠直接使用 Metal.函數

MVC 裏的 C 能夠作得很精簡,ActionController::Metal 就是例子。除了提供一個有效的 Rack 接口外,它幾乎沒有任何其它功能。性能

舉個例子:code

rubyclass 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.ci

精簡的 ActionController::Base

首先,咱們看看 ActionController::Base 引入了哪些模塊:路由

rubyMODULES = [
  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

引入了這麼多模塊,雖然方便了使用。但有的模塊,咱們用不到。因此,浪費了。get

其它

  • 不反對給 Rails 進行瘦身,但不要盲目,要清楚本身在作什麼。it

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

  • 爲何可以連續調用,緣由:

你看每一個 Rack Middleware 的 call 函數的最後一行,是否是都是 @app.call(env)
這說明,它在調用下一個 middleware 啊。

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

順序是:默認是按 use 的順序走下去,但 use 時你也是能夠指定的。

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

相關文章
相關標籤/搜索