9

对于最新版本的 Ruby on Rails(在提出此问题时为 4),实现修改请求/响应的代码(例如身份验证机制)的首选方法是什么。我看到许多网站和教程都在提倡Rack 中间件,而似乎可以通过Action Controller 过滤器方法实现相同的功能。

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

4

2 回答 2

14

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

Rack 是标准的 Ruby 网络服务器接口。它的设计目的是使机架应用程序或“中间件”可以链接在一起,每个都以特定的方式转换请求/响应。如果您创建/使用机架中间件,您就有机会在请求实际到达 Rails 应用程序之前对其进行转换。

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

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

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

  1. 如果您只想在特定控制器中对请求之前的方法执行某些操作,请在该控制器中使用 before 过滤器。

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

  3. 如果你想对请求做一些通用的事情,根本不绑定到你的应用程序代码,并且你想能够在另一个应用程序中重用它会很好,机架中间件会更合适。

希望有帮助。

于 2015-01-17T02:24:13.267 回答
0

据我了解,动作控制器过滤器和机架中间件做的事情几乎相同,除了两件事:

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