Ruby単体の場合

 % tree
.
├── foo
│   └── bars_controller.rb
└── hoge.rb

hoge.rb

require './foo/bars_controller.rb'

bars_controller = Foo::BarsController.new
bars_controller.index

bars_controller.rb

class Foo::BarsController
  def index
    p :index
  end
end

結果(uninitialized constant Foo (NameError))

/Users/shingo/.rvm/rubies/ruby-2.2.3/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /Users/shingo/Documents/raku/sample/hoge.rb
/Users/shingo/Documents/raku/sample/foo/bars_controller.rb:1:in `<top (required)>': uninitialized constant Foo (NameError)
    from /Users/shingo/.rvm/rubies/ruby-2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /Users/shingo/.rvm/rubies/ruby-2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /Users/shingo/Documents/raku/sample/hoge.rb:1:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

Process finished with exit code 1

railsの場合

app/controllers/foo/bars_controller.rb

class Foo::BarsController < ApplicationController
  def index
  end
end

routes.rb

Rails.application.routes.draw do
  namespace :foo do
    resources :bars
  end
end

views/foo/bars/index.html.erb

<h1>Listing Bars</h1>

localhost:3000/foo/barsへアクセスの結果

Listing Bars

質問

どのようにしてrailsはuninitialized constant Foo (NameError)が起こらないようにしているのでしょうか?

それともRuby単体の場合で何か指定し忘れがありますでしょうか?
過去に
ruby on rails - ::で入れ子のModuleを宣言するとNameErrorになる - スタック・オーバーフロー
の質問をしていまして、この質問よりRuby単体ではこのようなNameErrorを避けるのは不可能という認識です。