我一直在创建一些 Rack 中间件,它们运行良好,只是我对我的 gem 的结构方式不满意。
在我的 sinatra 应用程序中,我需要如下中间件:
use MyProjectNamespace::MyMiddlewareClass, &config
这很好,但问题是我宁愿引用第二个命名空间而不是一个类,例如:
use MyProjectNamespace::MyMiddlewareNamespace, &config
但是如果我为 MyMiddlewareNamespace 使用一个模块,那么 rack 就会提示:
MyMiddlewareNamespace is not a class (TypeError)
问题是我在 MyProjectNamespace 下有多个 gem,我想将它们的命名空间分开,以便我可以有类似的东西:
module MyProjectNamespace::MyMiddlewareNamespace::Helpers
class SomeHelper
end
end
module MyProjectNamespace::AnotherMiddlewareNamespace::Helpers
class SomeHelper
end
end
有没有办法用 Rack 中间件做到这一点? Ruby 不允许模块与类名同名。
最佳答案
在您的情况下,看起来方法(初始化、调用)是在 SomeHelper 上定义的,而不是在命名空间上。在这种情况下,传入类名,而不是模块名:
use MyProjectNamespace::MyMiddlewareNamespace::SomeHelper, &config
但是,如果问题是您希望在模块中进行初始化和调用,则首先应该将该模块包含在一个类中,然后再传入该类。
你可以对一个实例做同样的事情——创建一个实例,告诉它使用模块(通过包含或扩展)并将它传递给 Sinatra 的“使用”而不是直接传递模块。
问题是 Rack 想要实例化你给它的任何东西。类是可实例化的,模块不是。
关于namespaces - 是否可以使用模块入口点而不是类来创建 Rack 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29453798/