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

时间:2015-06-25 14:55:54

标签: ruby

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

因此,我将实例变量@rows设置为等于空数组[]。我在方法中推送该数组,但Ruby返回undefined method 'push' for 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

为什么会返回此错误?

1 个答案:

答案 0 :(得分:3)

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

class MySerializer < ActiveModel::Serializer
  attributes :hierarchies

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

  ...

然后当你打电话

  MySerializer.new

@row将在实例的上下文

中初始化