2

我有一个使用 Bundler 设置的 Rails 项目。我捆绑的其中一个 gem 提供了一个 Rack 中间件,我想在我的 Rails 应用程序中使用它(但只能在“生产”Rails 环境中使用)。

如果我只是把这样的东西放进去config/environments/production.rb,我会得到一个未知的常量错误:

config.middleware.use ::Rack::MyMiddleware

...大概是因为Bundler.require此时尚未调用,并且我的捆绑宝石都不可用。

我找到了一些解决这个问题的方法,但没有一个看起来很好,我想知道我是否缺少更标准的解决方案:

  1. 明确require 'my_middleware_gem'地在config/environments/production.rb
  2. 将调用包装config.middleware.use在一个after_initialize块中,确保在我尝试引用常量之前 Bundler 有机会做它的事情。
  3. 使用字符串 ( "::Rack::MyMiddleware") 而不是裸类常量。由于某种原因,这似乎不适用于 Unicorn,但确实适用于其他一些服务器(对于 Unicorn,它最终会尝试调​​用"::Rack::MyMiddleware".new,这当然会失败)。

我错过了一些更好的方法吗?在初始化过程中的什么时候,捆绑的 gem 应该可用?

4

1 回答 1

0

复制评论中的答案,以便从“未回答”过滤器中删除此问题:

马特建议:

我认为after_initialize在这种情况下使用块是正确的方法。

抱怨者证实:

是的,这就是我最终的结果。谢谢!关于原始问题中提到的独角兽问题,原来我遇到了这个问题:http ://davidvollbracht.com/blog/headachenewunicorn-capistrano-bundler-usr2

于 2013-10-09T07:03:47.237 回答