Rails模块作为严格的命名空间

问题描述 投票:1回答:3

我对rails非常陌生,我对模块如何工作有点困惑。我有这样的项目结构:

# app/models/foo.rb
class Foo < ActiveRecord

# lib/external_service/foo.rb
module ExternalService
  class Foo

# lib/external_service/bar.rb
module ExternalService
  class Bar
    attribute :foo, Foo # not the model

之前我曾使用过许多编码语言,我希望很容易在Bar和ExternalService中使用'Foo',就像那样

LoadError:无法自动加载常量Foo,期望lib / external_service / foo.rb来定义它

通常,ExternalService :: Foo在ExternalService之外是不可见的,但整个项目都会因此而死亡

我只是缺少一种“严格模式”符号或任何东西,以确保我明显意味着服务中的ExternalService :: Foo并阻止服务杀死我的模型?

我知道我可以只添加模块,但我想保持代码可读。如果有人能在这种情况下帮助我,那会很好:)

谢谢

ruby-on-rails ruby-on-rails-4 module namespaces
3个回答

0
投票

所以你使用的是rails 4

如果要创建模块,首先需要导入或自动加载lib文件夹

例如,在application.rb中,您可以将lib文件夹添加到自动加载:

config.autoload_paths << Rails.root.join('lib')

之后,因为您正在使用rails,您应该创建一个文件夹层次结构,其中包含模块层次结构的蛇形名称,例如,如果您有:

module ExternalService
  class Foo
    ...
  end
end

你的foo.rb文件应该在名为'external_service'的文件夹中

{{project_root}}/lib/external_service/foo.rb

文件夹层次结构是rails的惯例。


0
投票

那么回答我自己的问题.. Ruby就像这样,它完全没问题。

在这种情况下,Foo模型已经加载,所以ruby更喜欢这个而不是本地模型。同样按字母顺序app /是在lib /之前

一个不那么漂亮但快速解决的问题就是这样称呼: attribute :foo, ExternalService::Foo

© www.soinside.com 2019 - 2024. All rights reserved.