【发布时间】:2019-11-07 21:37:24
【问题描述】:
假设我有两个标准的 Rails 资源定义为控制器,每个都有自己的 CRUD 操作(index、show 等...)
EmployeesControllerEmployees::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 中保留这个额外的虚拟文件感觉很愚蠢,尤其是当它甚至不是控制器本身时。
问题
有没有正确的方法来处理上述情况?选项 C 是我唯一的选择吗?我是否正确使用了命名空间,还是应该一起避免它们?
谢谢!
【问题讨论】:
-
这里要注意的一点是,您使用的是单数
AssignmentController,如果您声明的是单数资源,这很好,但如果用户可以有很多任务并且您使用的是 @987654339,则不行@.
标签: ruby-on-rails constants autoload