Ruby/Rails:重新打开类与覆盖类的区别

14

我想要在Rails模型中添加一个方法,以供测试使用。如果我这样做:

class Model
  def something_new
    do_something
  end
end
在Rails控制台或在运行时加载的文件中,如果对Model进行修改,它会被覆盖而不是修改。如果我在上面的代码行之前加上像v = Model.class这样的内容,则新方法将成功添加到现有类中。显然需要引用来表示重新打开现有类。
另一方面,可以添加一个方法到一个例如Fixnum的类中,而不必事先引用它。这里发生了什么,并且通常如何确保重新打开并修改现有类而不是被覆盖?
谢谢。
3个回答

13

看起来你在使用类之前没有要求它。当你写下Model.class而没有定义Model类时,Rails会自动带入Model类。如果只写了class Model,那就是一个类定义。只需执行require 'model'即可。


谢谢,那就是问题所在。当我看到 Model 类已经被识别时,我没有意识到它只是“自动识别”的。 - Mike Blyth
这个方法对我很有效,结合Rails定位我想要require的文件,类似于这样:https://dev59.com/tF0b5IYBdhLWcg3wT_tr - John Skiles Skinner

5

使用class_eval,这样你就可以正确地重新打开类。
这里有一篇非常好的关于重新打开类的文章。


2
作为对Chuck回答的补充,这里是Rails docs的引用:

6.1.1 类和模块关键字后面的常量 Ruby会查找跟在类或模块关键字后面的常量,因为它需要知道该类或模块是否将被创建或重新打开。

如果在那时常量未定义,则不认为它是缺少的常量,也不会触发自动加载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接