如何告诉Rails从顶级目录自动加载命名空间模型?

时间:2016-03-07 01:06:08

标签: ruby-on-rails ruby autoload

如何告诉Rails(5 beta3)在app/models而不是app/models/namespace中查找命名空间模型?

我有

module MyApp
  class User < ApplicationRecord
    ...
  end
end

如果我把它放在app/models/myapp Rails找到它。但是,由于我的所有模型都在MyApp模块中,我宁愿将它们保存在app/models中。

由于

1 个答案:

答案 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.rbapp/models/my_app/user.rb。同样,您可以在app/models中从其他命名空间模型中自动加载命名空间模型。

但是,只要您需要从代码中引用命名空间模型(例如,自身不在命名空间中,例如,您必须手动要求模型类文件),就会遇到问题。在控制台或单元测试中。将控制器放在子目录中但模型不在子目录中会很愚蠢。你会混淆任何看过你代码的人。因此,最好的办法是遵循Rails约定并将命名空间模型放在app/models的子目录中。