gpt4 book ai didi

ruby-on-rails - Rails 中的命名空间模型生成 NameError : uninitialized constant

转载 作者:数据小太阳 更新时间:2023-10-29 08:44:47 24 4
gpt4 key购买 nike

我有这样的文件夹结构:

app/
models/
bar/
foo.rb
connection.rb
foo.rb

connection.rb 是一个用于连接到另一个数据库的“抽象类”,因此:

class Bar::Connection < ActiveRecord::Base
self.abstract_class = true
establish_connection "outsidedb_#{Rails.env}"
end

bar/foo.rb 用于从 outsidedb 访问 foos 表,因此:

class Bar::Foo < Bar::Connection
end

foo.rb 用于从应用程序的数据库访问 foos 表,因此:

class Foo < ActiveRecord::Base
end

从 Rails 控制台,如果我执行 Foo.firstBar::Foo.first,事情的行为就像我期望的那样,因为我从foos 分别是应用数据库和外部数据库的表。

但是,如果我尝试从 bar/foo.rb 中访问 Foo,我会得到以下信息:

class Bar::Foo < Bar::Connection
def self.test
Bar::Foo.first #=> works
Foo.first #=> NameError: uninitialized constant Bar::Foo::Foo
end

def self.other_test
Foo.parent #=> Object
Foo.superclass #=> ActiveRecord::Base
Object::Foo.first #=> works
ActiveRecord::Base::Foo.first #=> works, but with "warning: toplevel constant
# Foo referenced by ActiveRecord::Base::Foo
end
end

我显然可以让事情正常进行,但我正在寻求对正在发生的事情有更深入的了解。我假设我在 Ruby 的常量/类评估和 Rail 的内置自动加载之间遗漏了一些东西......

  1. 什么是 .parent 返回(不是“父”类)?
  2. 为什么我在 .test 中得到错误,但在 Rails 控制台中却没有得到它?
  3. 为什么 Object::Foo 似乎有效?这是正确的做法吗?
  4. 为什么 ActiveRecord::Base::Foo 可以工作,但有警告?
  5. 有更多的 rails 方法来完成我所做的事情,而不仅仅是重命名我的 foo.rb 类之一吗?

我正在使用 Rails '3.2.13'Ruby 1.9.3-p194,让你知道!

最佳答案

你的问题可以用

解决
::Foo.first

这里的::Foo表示顶级命名空间中的类Foo

你的问题来自这样一个事实,即你正在使用的命名空间 (Bar) 中还有另一个 Foo 类。所以你应该明确。

至于为什么 Object::Foo 有效(带有警告)的问题,这是 Ruby 中名称查找的(鲜为人知的)行为。请看this文章了解更多详情。

关于ruby-on-rails - Rails 中的命名空间模型生成 NameError : uninitialized constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32853661/

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