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