20822


# Ruby単体の場合

[code]

     % tree
    .
    ├── foo
    │   └── bars_controller.rb
    └── hoge.rb
    
[/code]

**hoge.rb**

[code]

    require './foo/bars_controller.rb'
    
    bars_controller = Foo::BarsController.new
    bars_controller.index
    
[/code]

**bars_controller.rb**

[code]

    class Foo::BarsController
      def index
        p :index
      end
    end
    
[/code]

## 結果（uninitialized constant Foo (NameError)）

[code]

    /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
    
[/code]

# railsの場合

**app/controllers/foo/bars_controller.rb**

[code]

    class Foo::BarsController < ApplicationController
      def index
      end
    end
    
[/code]

**routes.rb**

[code]

    Rails.application.routes.draw do
      namespace :foo do
        resources :bars
      end
    end
    
[/code]

**views/foo/bars/index.html.erb**

[code]

    <h1>Listing Bars</h1>
    
[/code]

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

> Listing Bars

# 質問

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

それともRuby単体の場合で何か指定し忘れがありますでしょうか？  
過去に  
[ruby on rails - ::で入れ子のModuleを宣言するとNameErrorになる -
スタック・オーバーフロー](https://ja.stackoverflow.com/questions/20153/%e3%81%a7%e5%85%a5%e3%82%8c%e5%ad%90%e3%81%aemodule%e3%82%92%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%a8nameerror%e3%81%ab%e3%81%aa%e3%82%8b)  
の質問をしていまして、この質問よりRuby単体ではこのようなNameErrorを避けるのは不可能という認識です。


CC BY-SA 3.0
2016-01-11T02:27:58.347
20817
2016-02-01T00:45:36.960
2017-04-13T12:52:39.113
-1
9008
question
ruby-on-rails ruby
railsは存在しないモジュール配下にクラスを定義できるのは何故ですか？


[6.3 Automatic
Modules](http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#automatic-
modules) に答えがあります。該当部分を翻訳したので、これを読めば理由がわかるはずです。

> If autoload_paths has a file called admin.rb Rails is going to load that
> one, but if there's no such file and a directory called admin is found,
> Rails creates an empty module and assigns it to the Admin constant on the
> fly.

autoload_pathにadmin.rbというファイルがあればRailsはそれをロードしますが、admin.rbがなく、なおかつadminというディレクトリが見つかれば、Railsは実行時に空のモジュールを作成し、そこにAdminという定数をアサインします。


CC BY-SA 3.0
2016-01-11T03:44:05.037
20822
2016-01-11T03:44:05.037
85
20817
answer