Rack Middleware 和 ActionController Filters 真的很不一样。
Rack 是标准的 Ruby 网络服务器接口。它的设计目的是使机架应用程序或“中间件”可以链接在一起,每个都以特定的方式转换请求/响应。如果您创建/使用机架中间件,您就有机会在请求实际到达 Rails 应用程序之前对其进行转换。
ActionController 过滤器只是在 Rails 中的直接控制器方法之前或之后执行的之前/之后挂钩。这些将在您的控制器方法之前或之后立即调用,但在Rails 堆栈的整个其余部分之后。
因此,通过 Rack Middleware 和 ActionController 过滤器实现的功能存在显着差异,即,因为 Rack Middleware 在您的应用程序代码之前执行,它不会在与您的应用程序代码相同的范围内执行——例如,您不会除非您明确要求它们并执行必要的初始化(例如建立数据库连接),否则无法使用您的应用程序模型等。
如果您正在寻找经验法则,那么我想告诉您的是:
如果您只想在特定控制器中对请求之前的方法执行某些操作,请在该控制器中使用 before 过滤器。
如果您想在应用程序中的所有控制器方法之前对请求执行某些操作,并且您想要执行的操作非常特定于您的应用程序或依赖于您的应用程序代码,请在 ApplicationController 上使用过滤器。
如果你想对请求做一些通用的事情,根本不绑定到你的应用程序代码,并且你想能够在另一个应用程序中重用它会很好,机架中间件会更合适。
希望有帮助。