我是否正确理解application.rb
在整个Rails堆栈中运行中间件,而在config.ru
中放置一些东西抢占Rails堆栈?
这意味着如果我想要访问与我的Rails应用程序相同的会话和其他功能,我应该将我的中间件放在application.rb
中?但是,如果我所做的事情并不一定依赖于Rails,它可能会进入config.ru
?
答案 0 :(得分:2)
我不是Rails / Rack专家,但我已经编写了一些机架应用程序和中间件。所以我会尽力做到这一点。
这里有两个独立的过程,初始化和运行时执行。在初始化期间,任何Rack兼容服务器默认情况下都会以config.ru
文件开头。在这种情况下,run YourApp::Application
行之前的任何内容都无法访问config.ru
文件中未明确包含的任何内容。所以use MyMiddleware something: MyRailsModel.first
不起作用。如果您要在application.rb
或environment.rb
或config/initializers/*.rb
中执行相同的操作,那么您将处于Rails初始化过程中的某个位置,并且可以访问已经初始化的任何内容,这可能是你需要的Rails核心中的任何东西。
但这只是初始化,所以它几乎适用于你要发送到中间件的任何配置参数。在运行时,Rails已经完全初始化,您应该可以访问任何Rails类,模块等。但是您应该运行rake middleware
并查看堆栈并查看您自己的中间件与之相关的位置。其他中间件和应用程序本身。 Rails不仅仅是实际的应用程序,它还会在堆栈中注入大量中间件。并且取决于中间件与堆栈中其他中间件相关的位置将影响请求的状态。
至于具体的会话,最近的Rails版本使用Rack会话,因此从Rack访问会话时不会有任何问题。
我知道这可能不像你想的那样简单或明确,但希望它有所帮助。理解架子和中间件一开始看起来很复杂,但是当你最终将各个部分组合在一起时,看到幕后没有太大的魔力,它的最大优点就是它的简单性,它变得容易理解