我是否正确理解application.rb
在整个 Rails 堆栈中运行中间件,同时放入一些东西config.ru
抢占 Rails 堆栈?
这意味着,如果我说例如想要访问与我的 Rails 应用程序相同的会话和其他功能,我应该将我的中间件放在application.rb
? 但是,如果我正在做的事情不一定依赖于 Rails,它可能会进入config.ru
?
我不是 Rails/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访问会话应该不会遇到任何问题。
我知道这可能不像你想要的那么简单或明确的答案,但希望它有所帮助。机架和中间件起初看起来很复杂,但是当你最终把它是如何工作的碎片放在一起,并看到幕后没有太多的魔力,它最大的优势实际上是它的简单性,它变得更容易理解。