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来指代它不明确的那些