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

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

class Model
  def something_new
    do_something
  end
end

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

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

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby class namespaces


    【解决方案1】:

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

    【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多