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 一直在变,但又一直没变。

相关文章
相关标签/搜索