RoR - 哪种更好- Rack中间件还是Active Controller过滤器?

11

针对最新版本的 Ruby on Rails(在提问时为 4),实现修改请求/响应的代码,例如身份验证机制,有什么首选方法?我看到很多网站和教程都推荐使用Rack 中间件,但好像可以通过Action Controller 过滤器方法实现相同功能。

除了讨论首选方法外,还能否提供每种方法的优缺点比较?在我的初步调查中,似乎 action controller 过滤器方法更紧密地集成到 RoR 应用程序中,这样您就可以绕过在某些控制器端点上运行某些过滤器,而中间件似乎无法具有那种级别的控制。像这样的详情会很棒。谢谢!

2个回答

15
Rack中间件和ActionController过滤器确实有很大的区别。
Rack是标准的Ruby Web服务器接口。它被设计成这样一种方式,即Rack应用程序或“中间件”可以链接在一起,每个中间件以特定的方式转换请求/响应。如果您创建/使用Rack中间件,则有机会在实际到达Rails应用程序之前转换请求。
ActionController过滤器仅仅是在Rails中控制器方法之前或之后执行的钩子。这些将在控制器方法之前或之后立即调用,但在整个Rails堆栈之后。
因此,通过Rack中间件和ActionController过滤器可能存在显著的区别,具体取决于具体情况。由于Rack中间件在您的应用程序代码之前执行,因此不会在与应用程序代码相同的范围内执行--例如,除非您明确要求并执行必要的初始化(例如建立数据库连接),否则您不能使用应用程序模型等。
如果您正在寻找指导方针,则可以采用以下措施:
1. 如果您想在特定控制器中仅对方法进行操作,请在该控制器中使用before过滤器。 2. 如果您想在应用程序中的所有控制器方法之前对请求进行操作,并且所需的操作非常特定于您的应用程序或依赖于您的应用程序代码,请在您的ApplicationController上使用过滤器。 3. 如果您想对请求执行通用操作,与您的应用程序代码无关,并且您想象它将在另一个应用程序中重复使用,则Rack中间件将更适合。
希望这可以帮到你。

0
就我所知,Action Controller过滤器和Rack中间件基本上是在做相同的事情,唯一的区别在于:
  • Rack中间件在Rails堆栈之前调用,因此您可以获得一些性能提升(虽然我不确定)
  • Rack中间件是自包含的,并且可在不同的Rack应用程序之间重复使用,从而使您的Rails/Engine控制器和Sinatra/Merb/Padrino 应用程序更加简洁和DRY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接