【问题标题】:Namespaced class on rails' app folderrails 的 app 文件夹上的命名空间类
【发布时间】:2016-07-03 09:01:11
【问题描述】:

我有以下文件夹结构:

app
├── assets
├── controllers
├── helpers
├── mailers
├── market_adapters
│   └── german.rb
│...

而文件market_adapters/german.rb是:

module MarketAdapters #(I've also tried naming it singular)
   class German
   end
end

运行测试时出现错误:

/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)

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

如果我将market_adapters 移动到lib 文件夹,一切正常。但仍想在app 下拥有它,有什么想法吗?

顺便说一下,我使用的是 Rails 5。

【问题讨论】:

    标签: ruby-on-rails ruby rspec rspec-rails activesupport


    【解决方案1】:

    app 中的所有子文件夹都会自动自动加载并添加到加载路径中。因此,文件夹market_adapters被添加到加载路径中,名为german.rb的文件预计会定义German类。

    如果你真的想使用market_adapters作为命名空间并将文件保存在应用程序中,你需要将它存储在文件夹app/market_adapters/market_adapters/german.rb中。

    然而,正确的位置是在 lib 中。

    【讨论】:

    • “然而,正确的地方是在 lib 中”——我在这里不同意你的观点。这显然是特定于应用程序的功能。它在 lib 中没有位置。 Lib 用于通用的可重用事物,例如 api 包装器、csv 生成助手等等。
    • @SergioTulentsev 这是你的解释。我个人将所有与模型/控制器/视图/邮件无关的自定义编写库都放在 lib 中。我写的几乎所有东西。我将它们放入应用程序命名空间。随意将它们保留在应用程序中,但正如您所见,Rails 本身似乎阻止了它在架构中。
    • 我同意@SergioTulentsev 关于“正确的地方”™。但我们必须同意,至少在 Rails 的愿景中这是正确的地方:)
    • rails 的“预防”只是自动加载工作原理的一个小细节(也就是说,忽略作为命名空间一部分的 app 直接下的文件夹名称)。通过将所有非 MVC 但仍特定于应用程序的代码放入 app/custom/market_adapters/german.rb,可以轻松解决此问题。在这里,您可以两全其美。 :)
    • @RustamA.Gasanov:是的,我的意思是:不要将适配器放在应用程序/适配器/适配器中。将它们放在 app/lib/adapters 中。以及 app/lib/service_objects 中的服务对象。这样,您的“自定义”代码就可以很好地包含在内,并且没有看起来很傻的双文件夹名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2015-10-06
    • 1970-01-01
    • 2023-03-25
    • 2015-06-15
    • 2019-05-11
    • 2023-02-02
    相关资源
    最近更新 更多