Engine routes in Application Controller

Mountable engines are designed to work like this, that is isolate the main app routes and the engine routes.

If you want the two sets of routes to be merged, you can use a non-isolated engine. The first step is removing the isolated_namespace method call in your engine definition:

module MyEngine
  class Engine < Rails::Engine
    isolate_namespace MyEngine # remove this line
  end
end

The second step is to convert your routes in my_engine/config/routes.rb, you should go from this:

MyEngine::Engine.routes.draw do
  # stuff that routes things
end

to this:

Rails.application.routes.draw do
  # stuff that routes things
end

and remove the mount method call in your application's routes:

App::Application.routes.draw do
  mount MyEngine::Engine => "/engine" # remove this line
end

The main advantages of doing it this way would be:

  1. No need to monkey-patch rails. I know devise does this, but this could be a leftover from the days when engines didn't exist in rails.

  2. No need to mount the engine in the application routes. On the other hand, this could backfire if you'd like to control more precisely the insertion point as all you engine routes would be called after (or before, I don't have the answer to this question) your main routes.

If you're looking for documentation on engines, the rails docs for the Engine class are a pretty good starting point. I'd strongly recommend that you read them (in case you haven't yet) if you're interested in the subject.


I figured out how to do this. The problems lies within the isolated namespace. In order to integrate the engine with the app and share the same layout (which may have path helpers from the main app) I did this:

Firstly I removed config/routes.rb from the engine

Then I removed the isolate_namespace from the engine class

module MyEngine
   class Engine < Rails::Engine
-    isolate_namespace MyEngine
   end
 end
end

I added a file that was loaded in the engine:

module ActionDispatch::Routing
  class Mapper
    def mount_my_engine_at(mount_location)
      scope mount_location do
        #Declare all your routes here
      end
    end
  end
end

Finally, in the main app's config/routes.rb instead of 'mount'ing the engine, you can call your method

mount_my_engine_at "mount_location"

This will basically 'mount' your engine as part of the main app instead of being isolated from it. It is similar to how Devise does it too.