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

标签 namespaces rack middleware

我一直在创建一些 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/

相关文章:

visual-c++ - 两个类对​​象之间的 Visual C++/CLI 相互访问?

actionscript-3 - 类之间的命名空间变量

ruby-on-rails - 对于 Rails,为什么 Gem Devise 基于 Rack 很重要?

node.js - 将node_acl模块与SailsJs集成

c++ - 在头文件中使用 C++ 'using' 关键字有错吗?

ruby-on-rails - "use"Ruby/Rails/Rack 代码中的关键字/词

ruby-on-rails - Rack::File 已弃用,请改用 Rack::Files - 新的 Ruby on Rails 项目

node.js - express.json() 与正文解析器

nuxt.js - Nuxt 3 在中间件中使用可组合性

php - 我需要在 Symfony2 中使用命名空间吗?