Rails:"不是模块"错误

时间:2015-05-19 00:15:15

标签: ruby-on-rails ruby ruby-on-rails-4 model namespaces

我正在使用命名空间和文件夹在Rails中对我的模型进行分组,并且遇到了一个问题,即文件没有被加载并且引发了TypeError - is not a module错误。

以下是追踪的顶部:

17:06:26 web.1  | TypeError - SetNetsuite is not a module:
17:06:26 web.1  |   app/models/integrations/set_netsuite/scenarios/new_mavenlink_project.rb:2:in `<module:Integrations>'
17:06:26 web.1  |   app/models/integrations/set_netsuite/scenarios/new_mavenlink_project.rb:1:in `<top (required)>'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:443:in `block in load_file'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:633:in `new_constants_in'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:442:in `load_file'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:342:in `require_or_load'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:480:in `load_missing_constant'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/dependencies.rb:180:in `const_missing'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/inflector/methods.rb:240:in `block in constantize'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/inflector/methods.rb:236:in `constantize'
17:06:26 web.1  |   activesupport (4.1.10) lib/active_support/core_ext/string/inflections.rb:66:in `constantize'

我的代码如下所示:

module Integrations
  module SetNetsuite
    module Scenarios
      class NewProject < Scenario
      end
    end
  end
end

我的文件夹结构是:

- models/
  - integrations/
    - set_netsuite/
      - scenarios/
        - new_project.rb

我在/models中自动加载所有内容:

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]

如果我将模型更改为此,则可以:

module Integrations
  class SetNetsuite::Scenarios::NewProject < Scenario
  end
end

我知道命名空间类与嵌套模块的行为略有不同,但我宁愿采用嵌套模块方法。

非常感谢任何帮助或建议。提前谢谢!

1 个答案:

答案 0 :(得分:0)

UPD

似乎你require 'integrations'new_mavenlink_project.rb中的所有其他模块,虽然你不应该,自动加载的全部内容是你不需要在rails应用程序中的任何地方需要任何东西。要访问NewProject类,您只需调用:

Integrations::SetNetsuite::Scenarios::NewProject

在这种情况下,您不需要向autoload_paths添加任何内容,rails会从嵌套中生成它。