2015-07-20 95 views
1

我跑進使用Mongoid與軌道模型此錯誤:Mongoid超載的初始化

NoMethodError: undefined method `[]' for nil:NilClass

爲了簡化,我的課被宣佈如下:

class Fruit 
    include Mongoid::Document 

    field :name, type: String 

    def initialize 
     self.name = 'fruit' 
    end 
end 

起初我想不出這是從哪裏來的,所以我開始削減一些東西。採取Mongoid :: Document包括解決問題(但顯然不是理想的)。進一步按摩谷歌後,我發現這個討論:

https://github.com/mongoid/mongoid/issues/1678

...這說明了同樣的問題。當我想用一個初始化的機制來設置實例變量在子類中,我想出了這個解決方案:

class Fruit 
    include Mongoid::Document 

    field :name, type: String, default: ->{ self.do_init } 

    def do_init 
     self.name = 'fruit' 
    end 
end 

這工作,但似乎不太理想。然後再一次,也許沒關係。我想發佈這個是因爲:a)我很難找到類似問題的描述,b)我雖然在mongoid中沒有很好的記錄。

據我所知,Mongoid gem重載初始化,並且我試圖覆蓋初始化重新重載並打破了Mongoid :: Document的初始化過程。

+0

對;這是我輸入的一個例子。編輯以糾正以上。感謝您收到 – sgillesp

+0

before_create可能是最接近於Object :: initialize pattern.thanks! – sgillesp

回答

2

我一直試圖解決這個問題幾個小時,只是想通了。你需要在初始化方法開始時調用super。例如,

class Fruit 
    include Mongoid::Document 

    field :name, type: String 

    def initialize 
     super 
     self.name = 'fruit' 
    end 
end 

不幸的是,我不知道紅寶石給你一個解釋爲什麼這是必要的。考慮到超類僅僅是Object,我並不完全理解超級作品在這種情況下的作用。