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

Posted

技术标签:

【中文标题】Ruby/Rails:重新打开与覆盖类【英文标题】:Ruby/Rails: Reopening vs Overwriting a Class 【发布时间】:2011-05-26 18:20:16 【问题描述】:

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

class Model
  def something_new
    do_something
  end
end

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

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

谢谢。

【问题讨论】:

【参考方案1】:

听起来你在使用它之前不需要这个类。当你写 Model.class 并且没有 Model 类时,Rails 会自动为你引入 Model。如果您只写class Model,它只会将其视为类定义。只需执行require 'model' 就可以了。

【讨论】:

谢谢,这就是问题所在。当我看到 Model 类已经被识别时,我没有意识到它只是“自动”识别的。 这对我有用,结合指导 Rails 找到我想要的文件 require 类似于:***.com/questions/29348751/…【参考方案2】:

使用class_eval,这样您就可以以正确的方式重新开课。 这是reopening classes上的一篇非常好的文章。

【讨论】:

【参考方案3】:

正如 Chuck 的答案的补充,这里引用了 Rails docs:

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

如果此时未定义常量,则不会将其视为丢失常量,不会触发自动加载。

【讨论】:

以上是关于Ruby/Rails:重新打开与覆盖类的主要内容,如果未能解决你的问题,请参考以下文章

Ruby / Rails超时与线程 - 如何等待一段时间然后重新加入

ruby 类方法,实例方法内省ruby / rails

ruby Rails - Rails中用于菜单链接的简单“活动”类

Ruby/Rails:您如何自定义 Devise 的邮件模板?

Ruby/Rails:您如何自定义 Devise 的邮件模板?

ruby rails动态css类