简体   繁体   中英

Proper way to use a Rack middleware from a gem in a Rails project with Bundler

I've got a Rails project that's setup using Bundler. One of my bundled gems provides a Rack middleware that I'd like to use in my Rails app (but only in the 'production' Rails environment).

If I just put something like this in config/environments/production.rb , I get an unknown constant error:

config.middleware.use ::Rack::MyMiddleware

... presumably because Bundler.require has not yet been called at this point, and none of my bundled gems are available.

I have found a few ways of working around this, but none seem great, and I'm wondering if there's a more standard solution that I'm missing:

  1. Explicitly require 'my_middleware_gem' in config/environments/production.rb
  2. Wrap the config.middleware.use call in an after_initialize block, ensuring that Bundler has a chance to do its thing before I try to reference the constant.
  3. Use a string ( "::Rack::MyMiddleware" ) instead of the bare class constant. This doesn't seem to work with Unicorn for some reason, but does work with some other servers (with Unicorn it ends up trying to call "::Rack::MyMiddleware".new , which of course fails).

Am I missing some better approach? At what point in the initialization process is it expected that bundled gems should be available?

Copying the answer from the comments in order to remove this question from the "Unanswered" filter:

matt suggested:

I think using the after_initialize block is the right way in this case.

grumbler confirmed:

Yeah, that's what I ended up going with. Thanks! Regarding the unicorn issue alluded to in the original question, turns out I was hitting this problem: http://davidvollbracht.com/blog/headachenewunicorn-capistrano-bundler-usr2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM