在Rails lib目录中继承

时间:2013-07-12 16:30:09

标签: ruby-on-rails ruby ruby-on-rails-3 inheritance ruby-on-rails-3.2

我正在尝试使一些类继承自Rails lib目录中的基类。

设置如下:

#lib/ab_tests/base.rb
module AbTests
  class Base
    # some methods...
  end
end

#lib/ab_tests/first_test.rb
module AbTests
  class FirstTest < AbTests::Base
    # some methods...
  end
end

我以config/application.rb以相当标准的方式要求这些文件

config.autoload_paths += %W(#{Rails.root}/lib/ab_tests)

但是,每当我尝试启动服务器时,我都会遇到致命的LoadError

[some path].../activesupport-3.2.12/lib/active_support/dependencies.rb:503:in `load_missing_constant': Expected [project name]/lib/ab_tests/base.rb to define Base (LoadError)

我已尝试过以下两种情况,每次都是同样的问题。

#lib/ab_tests/first_test.rb
class FirstTest < ::AbTests::Base

#lib/ab_tests/first_test.rb
class FirstTest < Base

此外,如果我从AbTests::Base删除对lib/ab_tests/base.rb的引用,则没有加载错误,因此不仅仅是存在导致问题的类的事实。只有当我尝试使用它时才会出现问题。

如何完成此继承以及为什么会出现此问题?

1 个答案:

答案 0 :(得分:2)

我通常会像这样构建这些东西:

-lib
  |- ab_tests.rb
  |- ab_tests/
       |- base.rb
       |- first_test.rb

ab_tests.rb的位置:

module AbTests
end

base.rbfirst_test.rb文件应该与您在第一个示例中列出的文件一样,除非您在模块中声明它时不需要指定命名空间(即,只需使用class FirstTest < Base代替class FirstTest < AbTests::Base)。