初始化的 Mongoid 重载

sgi*_*esp 3 ruby ruby-on-rails mongoid

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

NoMethodError: 未定义方法 `[]' 为 nil:NilClass

为简化起见,我的类声明如下:

class Fruit
    include Mongoid::Document

    field :name, type: String

    def initialize
        self.name = 'fruit'
    end
end
Run Code Online (Sandbox Code Playgroud)

最初我无法弄清楚这是从哪里来的,所以我开始削减事情。取出 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
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎不太理想。再说一次,也许没问题。我想发布这个是因为 a) 我很难找到类似问题的描述,并且 b) 我虽然这在 mongoid 中没有很好的记录。

据我了解,Mongoid gem 重载初始化,我尝试覆盖初始化重新重载并破坏了 Mongoid::Document 初始化过程。

tyl*_*ler 5

我一直试图解决这个问题几个小时,只是想通了。您需要在 initialize 方法的开头调用 super 。例如,

class Fruit
    include Mongoid::Document

    field :name, type: String

    def initialize
        super
        self.name = 'fruit'
    end
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,我对 ruby​​ 的了解不够,无法解释为什么需要这样做。我不完全理解 super 在这种情况下是如何工作的,因为超类只是 Object。