Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我如何告诉Rails从顶级目录自动加载带名称空间的模型?_Ruby On Rails_Ruby_Autoload - Fatal编程技术网

Ruby on rails 我如何告诉Rails从顶级目录自动加载带名称空间的模型?

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 类用户

我如何告诉Rails(5 beta3)在
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公约抗争。我不知道你是不是只是按照惯例办事就更好了。不是对你的问题的回答(很抱歉),只是一个想法。是的,我知道,如果我不得不使用一个额外的文件夹,那将是世界末日,但我想知道是否有一个简单的方法来保持东西更干净。谢谢