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

时间:2010-12-16 19:31:27

标签: ruby-on-rails ruby class namespaces

我想在Rails模型中添加一个方法,用于测试。如果我这样做

class Model
  def something_new
    do_something
  end
end

在Rails控制台或运行时加载的文件中,模型被覆盖而不是修改。如果我在上面的行之前添加v = Model.class之类的内容,则新方法会成功添加到现有类中。显然,需要参考来表示正在重新打开现有的类。

另一方面,可以添加一个方法,比如Fixnum,而不必先引用它。这里发生了什么,以及确保重新打开和修改现有类而不是被覆盖的常用方法是什么?

感谢。

3 个答案:

答案 0 :(得分:12)

听起来你在使用它之前不需要课程。当您编写Model.class并且没有Model类时,Rails会自动为您引入Model。如果您只是编写class Model,它只会将其视为类定义。只需做require 'model'即可。

答案 1 :(得分:4)

使用class_eval,这样你将以正确的方式重新开课 这是关于reopening classes的非常好的文章。

答案 2 :(得分:0)

作为 Chuck 答案的补充,这里是Rails docs的引文:

  

6.1.1类和模块关键字之后的常量   Ruby对在class或module关键字后面的常量执行查找,因为它需要知道是要创建还是重新打开该类或模块。

     

如果此时未定义常量,则认为该常量不是丢失的常量,不会触发自动加载。