gpt4 book ai didi

ruby-on-rails - Ruby:未初始化的未定义方法

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

Note: There are numerous answers explaining that you can get this error when you subclass ActiveRecord::Base and add an #initialize without super. No answer explains what is actually happening.

我正在使用其他人的代码,并且我在具有以下类层次结构的 Rails 应用程序中有一个 HTTParty 服务。请注意子类 #initialize 与父类具有不同的签名。

module A
class Base
include HTTParty
...
end
end

module A
class User < Base

def initialize(user)
@user = user
end
end
end

module A
class PublicUser < User

def initialize(opts = {})
@limit = opts[:limit]
# no call to super
end
end
end

在本地没有问题,但在 SemaphoreCI 中出现以下结果:

A::PublicUser.new(limit: 1).some_method
undefined method `some_method' for #<A::PublicUser not initialized>

我找不到任何关于“未初始化”消息的文档。是什么导致了这种失败?

最佳答案

好的,我知道了。我还用 标记了你的问题,因为普通的好 ruby 很少会出现这种奇怪的行为。

您遇到了两个不同的问题,或多或少无关。

  1. #<A::PublicUser not initialized>是(原文如此!)调用 inspect 的结果在 A::PublicUser .因此,ruby 会尝试格式化一条错误消息,然后——瞧——类以这种方式打印出来。

  2. Rails 让您一头雾水,还需要不断查找。 A::Base名称与 ActiveRecord::Base 冲突,猜猜当 class User < Base 时解决了什么问题被满足。要复制此行为,您可以打开控制台并执行:class Q < ActiveRecord::Base; end; Q.allocate ,导致 #<Q not initialized> . (你和我一样喜欢 Rails 吗?)

  3. 要解决此问题,请显式指定 class User < A::Base或重命名 BaseMyBase .抱歉提出这个建议。

关于ruby-on-rails - Ruby:未初始化的未定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768551/

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