2015-06-25 179 views
1

我在我的ActiveModel::Serializer下面的代碼片段。這是一種遞歸方法,但我需要添加到遞歸結束時返回的數組中。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 

爲什麼它返回這個錯誤?

+0

請出示您的所有代碼 –

+0

的這一切的代碼,但包裝在'class MySerializer Noah

+0

對,你的更新解釋了這個問題,這就是爲什麼我要求更多的代碼。您正在類範圍內定義'@ rows',而不是實例範圍,因爲實例變量默認爲'nil','@ rows'在任何實例方法中都是'nil'。你應該在構造函數中定義它 –

回答

1

問題是,您已經在您的類(構造函數本身)中定義了@row而不是實例。你應該把的@row初始化成類似:

class MySerializer < ActiveModel::Serializer 
    attributes :hierarchies 

    def initialize 
    super 
    @rows = [] 
    end 

    ... 

然後當你調用

MySerializer.new 

@row將實例的範圍內進行初始化

+1

(難道你不需要打電話給超級?) –

+0

@DaveNewton我認爲你是對的。我會更新我的答案。 – Edward