【问题标题】:How to initialize Ruby class instance variable to a new instance of another class?如何将 Ruby 类实例变量初始化为另一个类的新实例?
【发布时间】:2021-05-11 13:40:42
【问题描述】:

我正在开发一个 Ruby on Rails 6 项目,我正在尝试在 ActiveRecord 模型上使用class instance variable。这是一个基本示例:

class Model << ApplicationRecord
  @var = AnotherClass.new
  
  class << self
    attr_reader :var
  end
  
  # ...
end

然后我希望能够使用Model.var 访问ModelAnotherClass 实例。有多个这样的模型,每个模型都引用不同的AnotherClass,所有AnotherClasses 都是一些BaseClass 的子类。

但是,我遇到了以下错误:

未初始化的常量 Model::AnotherClass

因为class &lt;&lt; self,Ruby 似乎在寻找嵌套类。

有没有办法直接访问AnotherClass,还是有更好的方法来设置它?

编辑:我用完全不同的方法解决了这个问题,但是我仍然有兴趣看看你将如何解决这个问题。

【问题讨论】:

  • 你遇到的错误是告诉你没有找到常量AnotherClass。你确定是加载? AnotherClass 在哪里? lib/ 中的任何内容都不会被自动加载器覆盖,在这些情况下您需要首先 require 'another_class'(或将其添加到自动加载路径中)。
  • @3limin4t0r 谢谢,我在您发表评论前大约十 10 秒发现了这一点。 ;) 如果您发布答案,我会接受。

标签: ruby-on-rails ruby


【解决方案1】:

您收到的错误:

未初始化的常量 Model::AnotherClass

告诉您AnotherClass 未初始化(未加载/找到)。让我以以下上下文为例:

class Model
  AnotherClass
end

Ruby 将开始持续查找。这将从当前命名空间 (Model) 开始,如果没有找到任何内容,则向上移动到命名空间树中。在上面的例子中,它会首先寻找Model::AnotherClass,如果找不到它会寻找AnotherClass,如果找不到它会抛出你收到的异常。

这个错误只是告诉你AnotherClass没有加载。

app/ 目录中的任何内容都由 Rails 的自动加载器加载,但是如果您使用 lib/ 目录,则必须手动 require 'another_class' 或将相关路径添加到 autoload paths

【讨论】:

  • 这解释了很多。我没有意识到 Ruby 会首先查找 Model::AnotherClass before AnotherClass。我按照建议的herelib/ 目录移动到app/lib/ 解决了这个问题。
  • @JacobLockard 或者,您可以在常量前面加上 :: 以使 Ruby 在顶层查找它,即 ::AnotherClass
  • @Stefan 这通常可以工作,但在我的情况下它没有,因为 Rails 根本没有加载 another_class.rb
猜你喜欢
  • 2011-06-21
  • 2011-12-25
  • 2015-06-09
  • 1970-01-01
  • 2017-10-23
  • 2017-04-05
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
相关资源
最近更新 更多