如何告诉Rails(5 beta3)在app/models
而不是app/models/namespace
中查找命名空间模型?
我有
module MyApp
class User < ApplicationRecord
...
end
end
如果我把它放在app/models/myapp
Rails找到它。但是,由于我的所有模型都在MyApp
模块中,我宁愿将它们保存在app/models
中。
由于
答案 0 :(得分:3)
不,你不能告诉Rails在自动加载路径的目录顶层寻找合格的常量(如MyApp::User
),如(app/models
)。当Rails看到MyApp::User
时(在代码中不在模块定义中),它只会在自动加载路径中的目录中查找my_app/user.rb
。
你可以通过永远不使用限定常量来欺骗Rails。如果您的控制器位于相同的命名空间中,则以下操作将起作用:
应用程序/控制器/程序my_app / users_controller.rb
module MyApp
class UsersController < ApplicationController
def index
@users = User.all
end
end
end
应用程序/模型/ user.rb
module MyApp
class User < ActiveRecord::Base
end
end
Rails不知道控制器中引用的User
是顶级还是MyApp
,因此它会查找app/models/user.rb
和app/models/my_app/user.rb
。同样,您可以在app/models
中从其他命名空间模型中自动加载命名空间模型。
但是,只要您需要从代码中引用命名空间模型(例如,自身不在命名空间中,例如,您必须手动要求模型类文件),就会遇到问题。在控制台或单元测试中。将控制器放在子目录中但模型不在子目录中会很愚蠢。你会混淆任何看过你代码的人。因此,最好的办法是遵循Rails约定并将命名空间模型放在app/models
的子目录中。