注意:有许多答案解释说,当您继承
ActiveRecord::Base
并添加#initialize
而没有super
时,您可能会收到此错误。没有答案解释实际发生的事情。
我在其他人的代码中工作,我在具有以下类层次结构的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>
我找不到任何有关“未初始化”消息的文档。是什么导致了这种失败?
答案 0 :(得分:2)
好的,我明白了。我还用ruby-on-rails标记了你的问题,因为普通的红宝石很少会产生如此奇怪的行为。
您遇到过两个不同的问题,或多或少无关。
#<A::PublicUser not initialized>
是(sic!)在A::PublicUser
上调用inspect
的结果。因此,ruby尝试格式化错误消息并且vo-该类以这种方式打印出来。
Rails与你混在一起,以及不断查找。 A::Base
名称与ActiveRecord::Base
冲突,并猜测在满足class User < Base
时解决了什么问题。要复制此行为,您可以打开控制台并执行:class Q < ActiveRecord::Base; end; Q.allocate
,从而生成#<Q not initialized>
。 (你是否像我一样喜欢Rails?)
要解决此问题,请明确指定class User < A::Base
或将Base
重命名为MyBase
。很抱歉建议。