是否可以使用模块入口点而不是类创建Rack中间件?

时间:2015-04-05 03:28:02

标签: namespaces rack middleware

我已经创建了一些完美的Rack中间件,除了我对我的宝石结构的方式不满意。

在我的sinatra应用程序中,我需要中间件,如:

use MyProjectNamespace::MyMiddlewareClass, &config

这很好,但问题是我宁愿引用第二个命名空间而不是类,如:

use MyProjectNamespace::MyMiddlewareNamespace, &config

但如果我使用MyMiddlewareNamespace的模块,那么机架抱怨:

  

MyMiddlewareNamespace不是类(TypeError)

问题是我在MyProjectNamespace下有多个宝石,我想分开它们的命名空间,这样我就可以得到类似的东西:

module MyProjectNamespace::MyMiddlewareNamespace::Helpers
  class SomeHelper
  end
end

module MyProjectNamespace::AnotherMiddlewareNamespace::Helpers
  class SomeHelper
  end
end

有没有办法用机架中间件做到这一点? Ruby不允许模块与类名具有相同的名称。

1 个答案:

答案 0 :(得分:0)

在您的情况下,看起来方法(initialize,call)是在SomeHelper上定义的,而不是在命名空间上定义的。在这种情况下,传入类名,而不是模块名:

use MyProjectNamespace::MyMiddlewareNamespace::SomeHelper, &config

但是,如果问题是你想要初始化并调用模块,首先应该将该模块包含在一个类中,然后传入该类。

你可以用一个实例做同样的事情 - 创建一个实例,告诉它使用模块(通过include或extend)并将其传递给Sinatra的“use”而不是直接传递模块。

问题是Rack想要实例化你提供的任何东西。类是可实例化的,模块不是。