RoR - 哪个是首选 - 机架中间件或主动控制器过滤器?

RoR - Which is preferred - Rack Middleware or Active Controller Filters?

对于 Rails 上 Ruby 的最新版本(在提出这个问题时为 4),实现修改 request/response 的代码的首选方法是什么,例如一种认证机制。我看到许多网站和教程提倡 Rack middleware while it seems like the same functionality can be achieved through Action Controller filter methods

除了讨论首选方法外,能否提供每种方法的优缺点比较?在我最初的调查中,动作控制器过滤器方法似乎更紧密地集成到 RoR 应用程序中,这样您就可以绕过 运行 某些控制器端点上的某些过滤器,而中间件似乎无法达到那种水平控制。这样的细节会很棒。谢谢!

据我了解,Action Controller 过滤器和 Rack 中间件在做几乎相同的事情,除了两件事:

  • Rack 中间件在 Rails 堆栈之前调用,这样您可以获得一些性能(虽然不确定)
  • Rack 中间件是独立的,可在不同的 Rack 应用程序之间重复使用,因此您的 Rails/Engine 控制器和 Sinatra/Merb/Padrino apss 是干净和干燥的

Rack Middleware 和ActionController Filter 真的很不一样。

Rack 是标准的 Ruby 网络服务器界面。它的设计工作方式是 Rack 应用程序或 "Middlewares" 可以链接在一起,每个都以特定方式转换请求/响应。如果您 create/use 一个机架中间件,您将有机会在请求实际到达 Rails 应用程序之前转换请求。

ActionController 过滤器只是 before/after 挂钩,在 Rails 中的直接控制器方法之前或之后执行。这些将在您的控制器方法之前或之后立即调用,但 Rails 堆栈的整个剩余部分之后。

因此,通过机架中间件和 ActionController 过滤器可能实现的功能存在显着差异,即,因为机架中间件在您的应用程序代码之前执行,所以它不会在与您的应用程序代码相同的范围内执行 - - 例如您将无法使用您的应用程序模型等,除非您明确要求它们并执行必要的初始化(如建立数据库连接)。

如果您正在寻找经验法则,我想告诉您的是:

  1. 如果您只想在特定控制器中使用请求前方法,请在该控制器中使用前过滤器。

  2. 如果您想在应用程序中的所有控制器方法之前对请求执行某些操作,并且您想要执行的操作非常特定于您的应用程序或依赖于您的应用程序代码,请使用过滤器你的 ApplicationController.

  3. 如果您想对请求做一些通用的事情,完全不依赖于您的应用程序代码,并且您认为能够在另一个应用程序中重复使用它会很好,a机架中间件会更合适。

希望对您有所帮助。