Ruby on rails 我如何告诉Rails从顶级目录自动加载带名称空间的模型?
我如何告诉Rails(5 beta3)在Ruby on rails 我如何告诉Rails从顶级目录自动加载带名称空间的模型?,ruby-on-rails,ruby,autoload,Ruby On Rails,Ruby,Autoload,我如何告诉Rails(5 beta3)在app/models中而不是在app/models/namespace中查找命名空间模型 我有 module MyApp class User < ApplicationRecord ... end end 模块MyApp 类用户
app/models
中而不是在app/models/namespace
中查找命名空间模型
我有
module MyApp
class User < ApplicationRecord
...
end
end
模块MyApp
类用户<应用程序记录
...
结束
结束
如果我把它放在app/models/myapp
Rails中就会找到它。但是,由于我的所有模型都在MyApp
模块中,我宁愿将它们保存在app/models
中
谢谢不,您不能告诉Rails在自动加载路径(如(
app/models
)的目录顶层查找限定常量(如MyApp::User
)。当Rails看到MyApp::User
(在不在模块定义内的代码中)时,它将只在自动加载路径的目录中查找myu app/User.rb
通过从不使用限定常量,可以在很多时候欺骗Rails。如果控制器位于同一名称空间中,则以下操作将起作用:
app/controllers/my_app/users_controller.rb
module MyApp
class UsersController < ApplicationController
def index
@users = User.all
end
end
end
模块MyApp
类UsersController
app/models/user.rb
module MyApp
class User < ActiveRecord::Base
end
end
模块MyApp
类用户
Rails不知道控制器中引用的用户是顶级用户还是MyApp
,因此它会同时查找app/models/User.rb
和app/models/my_app/User.rb
。类似地,您可以在app/models
中从其他名称空间模型自动加载名称空间模型
然而,当您需要从代码中引用一个名称空间模型时,如果代码本身不在名称空间中,例如在控制台或单元测试中,您就会遇到麻烦(也就是说,您必须手动要求模型类文件)。在子目录中有控制器而在子目录中没有模型是愚蠢的。你会把看过你代码的人弄糊涂。因此,最好的做法是遵循Rails惯例,将您的命名空间模型放在app/models
Hi的子目录中。我相信你知道这一点。但是,在这件事上,你似乎在与Rails公约抗争。我不知道你是不是只是按照惯例办事就更好了。不是对你的问题的回答(很抱歉),只是一个想法。是的,我知道,如果我不得不使用一个额外的文件夹,那将是世界末日,但我想知道是否有一个简单的方法来保持东西更干净。谢谢