Loading nested gems with zeitwerk

Montag, 12. April 2021, 14:40 Uhr | roberto@vasquez-angel.de |

When you have a gem with an nested namespace like “rao-api-resources_controller” (-> Rao::Api::ResourcesController) you cannot use the for_gem method of zeitwerk. Instead you can do as follows:

# lib/rao/api/resources_controller.rb
loader = Zeitwerk::Loader.new.tap do |loader|
  root = Pathname.new(File.expand_path("../../..", __dir__))

  loader.push_dir(File.absolute_path(root.join("lib")))

  loader.inflector = Class.new(Zeitwerk::Inflector) do
    def camelize(basename, abspath)
      if abspath.end_with?("rao/api/resources_controller/version.rb")
        "VERSION"
      else
        super
      end
    end
  end.new

  loader.setup
  loader
end