我想澄清config.ru文件以指定机架中间件而不是使用config.middleware数组。
如果config.ru通常如下所示:
require ::File.expand_path('../config/environment', __FILE__)
use Rack::Deflater
run TestApp::Application
我是否正确地说当我运行TestApp :: Application时,我进入Rails内部中间件?也就是说,它是否开始在config.middleware中定义的中间件链?
因此,在rails应用程序之外指定中间件的有效用法是使用rails本身外部的请求(或响应)来做事情吗?那么在这个示例中,Deflator会在rails app中间件开始之前对请求进行操作吗?
使用config.middelware的有效用法是指定更多可以放置在该链中任何位置的特定于rails的中间件吗?
此外,当机架应用程序开始时,应用程序是什么? (这是传递给机架应用程序的初始化?)。我一直认为应用程序是rails应用程序本身,但似乎rails应用程序只是链中的另一个middelware。
答案 0 :(得分:1)
rails应用程序不是Rails中间件,而是Rack应用程序。它是中间件链的底部(用run
代替use
)。
我不太确定app.config.middleware数组的运行顺序与你在config.ru文件中输入的顺序有关,但我希望require ::File.expand_path('../config/environment', __FILE__)
行需要一个文件循环遍历中间件数组并在所有这些数组上调用use
以将它们添加到机架列表中。我在config.middleware数组中指定了中间件,以确保它被放置在你想要的位置。
我认为“Rails特定”和“机架”中间件之间没有区别。这一切都在一个巨型链中运行,直到你点击rails应用程序。实际上,许多Rails的功能都是中间件的形式(如果在命令行中键入rake middleware
,则可以看到整个列表。)