RoR - 首选 - 机架中间件或主动控制器滤波器?

时间:2015-01-10 06:38:51

标签: ruby-on-rails ruby ruby-on-rails-4 actioncontroller rack-middleware

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

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

2 个答案:

答案 0 :(得分:11)

机架中间件和ActionController过滤器真的很不一样。

Rack是标准的Ruby webserver接口。它的设计工作方式是Rack应用程序或" Middlewares"可以链接在一起,每个都以特定方式转换请求/响应。如果您创建/使用Rack Middleware,您将有机会在实际到达Rails应用程序之前转换请求。

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

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

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

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

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

  3. 如果你想对请求做一些通用的事情,而不是完全依赖你的应用程序代码,你想象能够在另一个应用程序中重用它会很好,架中软件会是更合适。

  4. 希望有所帮助。

答案 1 :(得分:0)

据我所知,Action Controller过滤器和Rack中间件几乎完全相同,除了两件事:

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