So, Ray has this exactly right. I would just like to add a further example.
Let's say we have an engine called Foo (original, right?) that is mounted in a host application called Bar with something like:
#bar/config/routes.rb
Rails.application.routes.draw do
...
mount Foo::Engine, at: '/'
...
end
Foo has an application_controller:
#foo/app/controllers/foo/application_controller.rb
module Foo
class ApplicationController < ActionController::Base
...
def foo_action
...
end
...
end
end
And Bar has an application_controller:
#bar/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
...
def bar_action
...
end
...
end
Now, let's say we have two controllers within the Foo engine, like:
#foo/app/controllers/foo/baz_controller.rb
module Foo
def BazController < ApplicationController
...
end
end
and
#foo/app/controllers/foo/bif_controller.rb
module Foo
def BifController < ::ApplicationController
...
end
end
The BazController inherits from ApplicationController (no :: in front). This means that it looks up ApplicationController in the current namespace (Foo). And so it will have the foo_action defined in Foo::ApplicationController.
The BifController inherits from ::ApplicationController (:: in front). This means that it looks up ApplicationController in the global namespace which, in this case, is the host application Bar. And so it will have the bar_action defined in Bar's ApplicationController.