Rails:在具有警告的子文件夹中组织模型:toplevel由B :: A引用的常量A.

今天我决定重新组织大量与用户相关的模型,我遇到了问题。

在我有这样的结构之前:

app/models/user.rb app/models/user_info.rb app/models/user_file.rb ... 

所以我将所有user_模型移动到用户子文件夹,如下所示:

 app/models/user.rb app/models/user/info.rb app/models/user/file.rb ... 

并将其定义更改为

 class User::Info < ActiveRecord::Base class User::File < ActiveRecord::Base ... 

User模型未更改(关联除外)。

User::File模型外,一切正常。 当我试图访问此模型时,我收到以下错误:

 warning: toplevel constant File referenced by User::File 

实际上它返回标准的ruby File类。

我做错了什么?

UPD1:

 root# rails c Loading development environment (Rails 3.2.13) 2.0.0p195 :001 > User::File (irb):1: warning: toplevel constant File referenced by User::File => File 2.0.0p195 :002 > User::Info => User::Info(...) 

UPD2:

 2.0.0p195 :001 > User::SomeModel NameError: uninitialized constant User::SomeModel 2.0.0p195 :002 > User::IO (irb):2: warning: toplevel constant IO referenced by User::IO => IO 2.0.0p195 :003 > User::Kernel (irb):3: warning: toplevel constant Kernel referenced by User::Kernel => Kernel 

我的应用程序没有任何IO或内核类,除了ruby默认值。

UPD3:

 # app/models/user.rb class User < ActiveRecord::Base has_many :files, class_name: 'User::File' .. end # app/models/user/file.rb class User::File < ActiveRecord::Base belongs_to :user # some validations, nothing serious end 

更新 :今年的圣诞节礼物是Ruby 2.5.0的发布,此错误不再发生。 使用Ruby 2.5+,您将获得所要求的常量或错误。 对于较旧的Ruby版本,请阅读:

您的User::File类未加载。 您必须要求它(例如在user.rb )。

当ruby / rails看到User::Info并对其进行评估时(简化;仅定义User ),会发生以下情况。

  • 检查User::Info是否已定义 – 它尚未(尚未)
  • 检查Info是否已定义 – 它尚未(尚未)
  • uninitialized constant – > do rails magic来查找user/info.rb文件并要求它
  • return User::Info

现在让我们再次为User::File做一遍

  • 检查是否定义了User::File – 它还没有(还)
  • 检查File是否已定义 – 它是(因为ruby有一个内置的File类)!
  • 产生警告,因为我们已经被要求User::File但得到了::File
  • return ::File

我们观察到rails魔法,它自动需要(尚未)常量的文件,对User::File不起作用,因为File不是未知的。

尝试将类称为User :: File,以区别于常规ruby文件。 你可以使用:: File来指代它不明确的那些