使用Bundler在Rails项目中使用来自gem的Rack中间件的正确方法

时间:2012-05-01 20:16:04

标签: ruby-on-rails bundler rack middleware

我有一个使用Bundler设置的Rails项目。我的一个捆绑的宝石提供了一个Rack中间件,我想在我的Rails应用程序中使用它(但仅限于'生产'Rails环境中)。

如果我在config/environments/production.rb中输入这样的内容,我会得到一个未知的常量错误:

config.middleware.use ::Rack::MyMiddleware

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

我找到了一些解决这个问题的方法,但似乎都没有,我想知道是否有一个我缺少的更标准的解决方案:

  1. require 'my_middleware_gem'
  2. 中的明确config/environments/production.rb
  3. config.middleware.use调用包裹在after_initialize块中,确保Bundler有机会在我尝试引用该常量之前执行此操作。
  4. 使用字符串("::Rack::MyMiddleware")代替裸类常量。由于某些原因,这似乎不适用于Unicorn,但它确实与其他一些服务器一起工作(使用Unicorn它最终会尝试调​​用"::Rack::MyMiddleware".new,这当然会失败)。
  5. 我错过了一些更好的方法吗?在初始化过程的什么时候,预计捆绑的宝石应该可用?

1 个答案:

答案 0 :(得分:0)

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

matt建议:

  

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

grumbler确认:

  

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