机架中间件:使用和运行构造

时间:2015-07-09 17:02:47

标签: ruby-on-rails ruby rack

我正在阅读有关Rack Middleware的this文章。它陈述如下:

  

Rack不仅仅是可用于与Web服务器通信的接口。   它用于分组和订购模块,通常是Ruby类,   并指定它们之间的依赖关系 Rack :: Builder放置这些模块   在彼此之上,创建最终网络的堆栈式结构   应用

基本上,我们可以使用ruby类将中间件堆叠在一起。我们只需要参考下一个中间件 - 有点让我想起装饰设计模式。

我们需要做的就是有一个构造函数,它将下一个应用程序(堆栈中的中间件)作为paraemter。其次,我们需要定义一个调用方法,它将环境哈希作为参数,并返回状态代码,环境哈希和响应体的数组。

这是提供的示例:

o

根据Rack文档,use方法将中间件添加到堆栈,run方法调度到应用程序。我对这种语法感到有些困惑。使用将虾添加到中间件堆栈并运行Lobster实例进入Shrimp构造函数?我仍然对此处的角色感到困惑。

2 个答案:

答案 0 :(得分:1)

您链接的文章提到Rack附带示例应用Lobster所以是的,首先,这是一个应用。

Shrimp类只是一个Ruby类,它应该是一个中间件的编写方式。

config.ru文件中,您需要模块,注册中间件,然后运行应用程序。

  

使用将虾添加到中间件堆栈并运行通过龙虾   实例进入Shrimp构造函数?

当您说use向中间件堆栈添加Shrimprun未必将Lobster实例传递到Shrimp构造函数时,您就是对的。 run只执行Rack应用程序并传递app实例是Rack内部工作的方式。真实的事情发生在注册中间件的use部分。

例如:

# config.ru
require 'rack'
require 'rack/lobster'
require 'shrimp_1'     
require 'shrimp_2'     
require 'shrimp_3'      

use Shrimp_1      
use Shrimp_2      
use Shrimp_3            
run Rack::Lobster.new </pre>

所有三个Shrimp类将按此顺序传递app(Lobster)个实例,这将由Rack本身处理。

答案 1 :(得分:0)