railsは存在しないモジュール配下にクラスを定義できるのは何故ですか?
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を避けるのは不可能という認識です。