我应该如何重构以下情况,以便Rails自动加载我的班级

时间:2018-01-13 11:36:06

标签: ruby-on-rails ruby

昨天我发布了一个奇怪的自动加载问题:https://stackoverflow.com/posts/comments/83451042?noredirect=1

似乎我找到了这背后的原因,我的实际代码看起来像:\

a.rb

require_relative './b/b.rb'

module A

  def self.abc content
    return A::B.new
  end

end

B没有任何幻想:

b.rb

module A

  class B
    def initialize
    end
  end

  class C < B
    def initialize
      super
    end
  end
end

当我启动应用程序时,我可以在控制台中运行A::C并找到该类。在我reload!之后,A::C会给出uninitialized constant。当我然后拨打A::B并在A::C后不久再次呼叫。

所以我想我不能让C级和B一样驻留在同一个“文件”中。由于C与B密切相关,我认为将这个可比较的代码放在一起是有意义的。我在这里错误思考,还是应该将其重组为不同的东西?

在正常的Rails之外使用类的新手。感谢。

1 个答案:

答案 0 :(得分:1)

  

当我启动应用程序时,我可以在控制台中运行A :: C并找到   类。在我重新加载!之后,A :: C给出了一个未初始化的常量。当我   然后调用A :: B并在A :: C之后不久再次工作。

因为rails console并不总是与reload!相同。您可以通过在cache_classes中将true配置为environments/development.rb来对此进行测试。您将不再收到错误。

遵循Rails的命名约定,再配置,甚至require_relative。 最终结构:

lib
-- my_lib
---- a
------ b.rb
------ c.rb
---- a.rb

不要忘记将您的lib my_lib添加到autoload_paths