18

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

在我有这样的结构之前:

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
4

2 回答 2

29

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

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

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

  • 检查是否User::Info已定义 - 它不是(还)
  • 检查是否Info已定义 - 它不是(还)
  • uninitialized constant-> 做 rails 魔法来找到user/info.rb文件并要求它
  • 返回User::Info

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

  • 检查是否User::File已定义 - 它不是(还)
  • 检查是否File已定义 - 它是(因为 ruby​​ 有一个内置File类)!
  • 产生警告,因为我们被要求User::File但得到::File
  • 返回::File

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

于 2013-07-17T12:02:35.530 回答
-1

尝试将类称为 User::File 以将其与常规 ruby​​ 文件区分开来。您可以使用 ::File 来指代不明确的那些

于 2013-07-17T09:35:29.860 回答