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 Rails - Rails中用于菜单链接的简单“活动”类
Ruby/Rails:您如何自定义 Devise 的邮件模板?