Когда вы учитесь использовать рельсы, одна из самых важных вещей, которую нужно знать, это то, как она загружает написанный вами код. Допустим, у вас есть HelloController в каталоге app / controllers / demo / sub. Если вы сгенерировали этот контроллер, он будет иметь правильное имя Demo :: Sub :: HelloController.
Когда ваш маршрут говорит рельсам искать "demo / sub / hello", это переводится в полное имя контроллера (Demo :: Sub :: HelloController), который будет пытаться вызвать rails. Ruby не может найти этот класс и вызывает const_missing, который заставляет rails переводить имя в файл, в этом случае demo / sub / hello_controller (:: = /, заглавные буквы, отличные от first = _, ищите Inflections в методе подчеркивания). Затем Rails требует этот файл и проверяет правильность определения класса.
Rails добавляет несколько каталогов в путь загрузки ruby (app / controllers, app / models, app / helpers, lib, vendor) и demo / sub / hello_controller.rb в любом из этих каталогов, удовлетворяющих требованиям. Но контроллеры, не входящие в приложение / контроллеры, нуждаются в особом внимании к их представлениям.
Кроме того, это работает для пространств имен, только он будет искать каталог. Так что ссылка на Demo :: Sub будет искать каталог demo / sub. Это позволяет вам отказаться от стандартного определения классов, так что вы можете сделать
class Demo::Sub::HelloController < ActionController::Base
end
вместо
module Demo
module Sub
class HelloController < ActionController::Base
end
end
end