rails'app文件夹上的Namespaced类

And*_*ano 0 ruby rspec ruby-on-rails activesupport rspec-rails

我有以下文件夹结构:

app
??? assets
??? controllers
??? helpers
??? mailers
??? market_adapters
?   ??? german.rb
?...
Run Code Online (Sandbox Code Playgroud)

该文件market_adapters/german.rb是:

module MarketAdapters #(I've also tried naming it singular)
   class German
   end
end
Run Code Online (Sandbox Code Playgroud)

运行测试时,我收到错误:

/gems/activesupport-5.0.0/lib/active_support/dependencies.rb:512:in
`load_missing_constant': Unable to autoload constant German, 
expected .../app/market_adapters/german.rb to define it (LoadError)
Run Code Online (Sandbox Code Playgroud)

添加market_adapters文件夹autoload_paths似乎没有任何效果config.autoload_paths << "#{Rails.root}/app/market_adapters"

如果我移动market_adapterslib文件夹,一切正常.但仍然想拥有它app,任何想法?

顺便说一下,我正在使用Rails 5.

Sim*_*tti 5

所有子文件夹都会app自动加载并添加到加载路径中.因此,该文件夹market_adapters将添加到加载路径,并且调用的文件german.rb应该定义German该类.

如果您确实想要使用market_adapters命名空间并将文件保留在应用程序中,则需要将其存储在文件夹中app/market_adapters/market_adapters/german.rb.

然而,正确的地方是在lib.

  • "然而,正确的地方是在lib" - 我在这里不同意你的看法.这显然是特定于应用程序的功能.它在lib中没有位置.Lib是用于通用的可重用的东西,比如api包装器,csv生成助手和诸如此类的东西. (3认同)
  • rails的"预防"只是自动加载工作方式的一个小细节(即,忽略直接在`app`下作为命名空间一部分的文件夹的名称).通过将所有非MVC但仍然是特定于应用程序的代码放到`app/custom/market_adapters/german.rb`中,可以轻松解决这个问题.在这里,你有两全其美.:) (3认同)
  • 甚至`app/lib/market_adapters/german.rb`,如果你愿意的话. (2认同)