我使用带有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初始化过程。
答案 0 :(得分:3)
我一直在努力解决这个问题几个小时,然后才弄明白。您需要在初始化方法的开头调用super。例如,
class Fruit
include Mongoid::Document
field :name, type: String
def initialize
super
self.name = 'fruit'
end
end
不幸的是,我对ruby的了解不足以解释为什么需要这样做。鉴于超类只是对象,我不完全理解超级作用是如何工作的。