Скажем, у меня есть два стандартных ресурса рельсов, определенных как контроллеры, каждый со своими собственными действиями CRUD (index
, show
и т. Д.)
EmployeesController
Employees::AssignmentController
Каталог выглядит так -
app/
controllers/
- employees_controller.rb
employees/
- assignment_controller.rb
Я пытаюсь выяснить, как лучше определить второй вложенный контроллер для работы с автозагрузчиком Rails.
Вариант A - Константа в пространстве имен
Если я это сделаю -
class Employees::AssignmentController < ApplicationController
...
end
В журнале приложений и при выполнении интеграционных тестов я получаю следующую ошибку:
LoadError: Unable to autoload constant Employees::AssignmentController, expected /Users/jeeves/git/my-project/app/controllers/employees/assignment_controller.rb to define it>
Не нравится константа, определенная как одно пространство имен - Employees::AssignmentController
Опция B - Вложенная константа внутри модуля
Если я это сделаю -
module Employees
class AssignmentController < ApplicationController
end
end
Я на самом деле получаю ту же ошибку LoadError
, что и выше.
Вариант C - Вложенная константа внутри класса
Наконец, если я это сделаю -
class Employees
class AssignmentController < ApplicationController
end
end
Я получу TypeError: Employees is not a class
, что имеет смысл, поскольку внешний class
не определеноЯ пытаюсь исправить это, добавив явное определение class
с пустым файлом
app/
controllers/
- employees_controller.rb
+ - employees.rb
employees/
- assignment_controller.rb
class Employees
end
И это работает. Но глупо, что этот дополнительный фиктивный файл висит в app/controllers
, особенно когда речь идет даже не о самом контроллере.
Вопрос
Существует ли правильный способ решения вышеуказанной ситуации? Вариант С мой единственный вариант? Правильно ли я использую пространства имен или мне следует избегать их всех вместе?
Спасибо!