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