我有一个使用 Bundler 设置的 Rails 项目。我捆绑的其中一个 gem 提供了一个 Rack 中间件,我想在我的 Rails 应用程序中使用它(但只能在“生产”Rails 环境中使用)。
如果我只是把这样的东西放进去config/environments/production.rb
,我会得到一个未知的常量错误:
config.middleware.use ::Rack::MyMiddleware
...大概是因为Bundler.require
此时尚未调用,并且我的捆绑宝石都不可用。
我找到了一些解决这个问题的方法,但没有一个看起来很好,我想知道我是否缺少更标准的解决方案:
- 明确
require 'my_middleware_gem'
地在config/environments/production.rb
- 将调用包装
config.middleware.use
在一个after_initialize
块中,确保在我尝试引用常量之前 Bundler 有机会做它的事情。 - 使用字符串 (
"::Rack::MyMiddleware"
) 而不是裸类常量。由于某种原因,这似乎不适用于 Unicorn,但确实适用于其他一些服务器(对于 Unicorn,它最终会尝试调用"::Rack::MyMiddleware".new
,这当然会失败)。
我错过了一些更好的方法吗?在初始化过程中的什么时候,捆绑的 gem 应该可用?