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

时间:2013-07-17 09:04:35

标签: ruby-on-rails ruby activerecord

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

在我有这样的结构之前:

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

2 个答案:

答案 0 :(得分:28)

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

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

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

  • 检查是否定义了User::Info - 它不是(还)
  • 检查是否定义了Info - 它不是(还)
  • uninitialized constant - &gt;做rails magic来找到user/info.rb文件并要求它
  • return User::Info

现在让我们再次为User::File

做一遍
  • 检查是否定义了User::File - 它不是(还)
  • 检查是否定义了File - 它是(因为ruby有一个内置的File类)!
  • 发出警告,因为我们已被要求User::File::File
  • return ::File

我们观察到自动需要(还有)未知常量文件的rails magic对User::File不起作用,因为File未知。

答案 1 :(得分:-1)

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