Ruby:未初始化的未定义方法

时间:2017-01-20 16:46:05

标签: ruby-on-rails ruby

  

注意:有许多答案解释说,当您继承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>

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

1 个答案:

答案 0 :(得分:2)

好的,我明白了。我还用标记了你的问题,因为普通的红宝石很少会产生如此奇怪的行为。

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

  1. #<A::PublicUser not initialized>是(sic!)在A::PublicUser上调用inspect的结果。因此,ruby尝试格式化错误消息并且vo-该类以这种方式打印出来。

  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或将Base重命名为MyBase。很抱歉建议。