ruby - 方法中无法访问类中的 ActiveModel::Serializer 实例变量

标签 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

为什么会返回这个错误?

最佳答案

问题是您在类(构造函数本身)而不是实例中定义了 @row。您应该将 @row 的初始化放入如下内容:

class MySerializer < ActiveModel::Serializer
  attributes :hierarchies

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

  ...

然后当你打电话

  MySerializer.new

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

关于ruby - 方法中无法访问类中的 ActiveModel::Serializer 实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31053872/

相关文章:

ruby-on-rails - Ruby on Rails/Devise - 更改电子邮件时需要密码

mysql - Rails DateTime 辅助逻辑

ruby - 对一个变量调用多个方法

ruby - Perl - Ruby 映射?

ruby - 有没有一种优雅的方法来重构与 Ruby/Rails gem 的命名空间冲突?

ruby - Ruby 在使用整数和 float 时如何解释指数?

Ruby 变量赋值

Ruby 模除法

ruby - 'gmaps4rails' 未定义局部变量或方法 'acts_as_gmappable' rails 3.2.1 路由错误

ruby - 将 Sinatra 设置为在子目录中运行