When to load Gem code when depending on rails

I'm developing a Gem that is to be used exclusively in Rails projects. It has been developed inside of a Rails application's lib directory and is now to be extracted in a separate Gem.

Some of the classes depend on the Rails framework to be loaded though. Two examples:

class OurGem::Hookup
  CONFIG_PATH = 'config/hookup.rb'.freeze
  [...]
end

class OurGem::RoutingContainer
  include Rails.application.routes.url_helpers
  [...]
end

Normally, I load the Gem code in the Gem's main module file using require . But as this is loaded by bundler, Rails is not ready and things like Rails.application and Rails.root cannot be used. The first example could be worked around by not evaluating the path at load time, but the second one seems kind of tricky to me.

What is the proper way of doing this? Register an initializer using a railtie and require the "delicate" files there?


This is a strange setup, because your gem depends on your rails app and your rails app depends on your gem.

This looks far too coupled to me. Have you considered creating a self-contained rails engine that your main app mounts, instead?

You might be able to get away with doing this, though:

# Gemfile
gem 'our_gem', require: false

# config/initializers/our_gem.rb
require 'our_gem'
OurGem::Hookup.config_path = '...'

This ensures that your gem is only being loaded after the rails application initialises - so things like Rails.application.routes.url_helpers will be defined.

链接地址: http://www.djcxy.com/p/81116.html

上一篇: Rails 3中的宝石

下一篇: 何时根据导轨加载Gem代码