我已经创建了一些完美的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不允许模块与类名具有相同的名称。
答案 0 :(得分:0)
在您的情况下,看起来方法(initialize,call)是在SomeHelper上定义的,而不是在命名空间上定义的。在这种情况下,传入类名,而不是模块名:
use MyProjectNamespace::MyMiddlewareNamespace::SomeHelper, &config
但是,如果问题是你想要初始化并调用模块,首先应该将该模块包含在一个类中,然后传入该类。
你可以用一个实例做同样的事情 - 创建一个实例,告诉它使用模块(通过include或extend)并将其传递给Sinatra的“use”而不是直接传递模块。
问题是Rack想要实例化你提供的任何东西。类是可实例化的,模块不是。