Ruby 类中的ActiveModel::Serializer实例变量在方法中不可访问

Ruby 类中的ActiveModel::Serializer实例变量在方法中不可访问,ruby,Ruby,我的ActiveModel::Serializer中有下面的代码片段。这是一个递归方法,但我需要添加到递归结束时返回的数组中 因此,我将一个实例变量@rows设置为一个空数组[]。我在方法中推送该数组,但是Ruby返回了一个未定义的方法“push”,用于nil:NilClass class MySerializer < ActiveModel::Serializer attributes :hierarchies @rows = [] def hierarchies_run

我的
ActiveModel::Serializer
中有下面的代码片段。这是一个递归方法,但我需要添加到递归结束时返回的数组中

因此,我将一个实例变量
@rows
设置为一个空数组
[]
。我在方法中推送该数组,但是Ruby返回了一个未定义的方法“push”,用于nil:NilClass

class MySerializer < ActiveModel::Serializer
  attributes :hierarchies

  @rows = []

  def hierarchies_run(child, user)
    hierarchy = UserHierarchy.where(child: child, user_id: user).first

    if hierarchy
      @rows.push(UserSimpleSerializer.new(User.find(hierarchy.child), :root => false))
      hierarchies_run(hierarchy.parent, current.id)
    else
      @rows.push(UserSimpleSerializer.new(User.find(child), :root => false))
    end
  end

  def hierarchies
    hierarchies_run(current.id, current.id)
    @rows
  end
end
class MySerializerfalse)
层次结构\u运行(hierarchy.parent,current.id)
其他的
@rows.push(UserSimpleSerializer.new(User.find(child),:root=>false))
结束
结束
def层次结构
层次结构\u运行(current.id,current.id)
@排
结束
结束

它为什么返回此错误?

问题是您在类(构造函数本身)中定义了
@row
,而不是在实例中。您应该将
@row
的初始化设置为:

class MySerializer < ActiveModel::Serializer
  attributes :hierarchies

  def initialize(*args)
    super
    @rows = []
  end

  ...

@row
将在实例的上下文中初始化

请显示所有代码这是所有代码,但包装在
类MySerializer
中。对,您的更新解释了问题,这就是我要求更多代码的原因。您在类范围而不是实例范围中定义
@rows
,因为实例变量默认为
nil
@rows
在任何实例方法中都是
nil
。你应该在一个构造器中定义它,把它放在一个答案中让我接受。(你不需要打个电话给super吗?@DaveNewton我想你是对的。我将更新我的答案。在0.10.7中,您需要执行
def initialize(*args)
@littleforest谢谢,您肯定是对的,因为这是关于扩展ActiveModel::Serializer的。那样总是比较安全的。我会更新我的答案。
  MySerializer.new