gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:26 25 4
gpt4 key购买 nike

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

在我有这样的结构之前:

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

所以我将所有 user_ 模型移动到 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 default 除外。

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 是否已定义——(还)未定义
  • 未初始化的常量 -> 使用 rails 魔法找到 user/info.rb 文件并需要它
  • 返回用户::信息

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

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

我们观察到 Rails 的魔力,它自动需要文件来处理(还)未知的常量,但对 User::File 不起作用,因为 File 不是未知的。

关于ruby-on-rails - Rails:在具有警告的子文件夹中组织模型:B::A引用的顶级常量A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17695557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com