Mongoid重载初始化

时间:2015-07-20 07:00:27

标签: ruby-on-rails ruby mongoid

我使用带有rails模型的Mongoid遇到了这个错误:

  

NoMethodError:          未定义的方法`[]'为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初始化过程。

1 个答案:

答案 0 :(得分:3)

我一直在努力解决这个问题几个小时,然后才弄明白。您需要在初始化方法的开头调用super。例如,

class Fruit
    include Mongoid::Document

    field :name, type: String

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

不幸的是,我对ruby的了解不足以解释为什么需要这样做。鉴于超类只是对象,我不完全理解超级作用是如何工作的。