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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails模块作为严格的命名空间相关的知识,希望对你有一定的参考价值。

我对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并阻止服务杀死我的模型?

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

谢谢

答案

您可以参考以下链接。这些将帮助您更好地理解这个概念

https://coderwall.com/p/2tnpfa/easily-namespace-your-rails-models

How do you find the namespace/module name programmatically in Ruby on Rails?

http://randycoulman.com/blog/2014/12/09/namespaced-classes-in-rails/

另一答案

所以你使用的是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的惯例。

另一答案

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

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

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

以上是关于Rails模块作为严格的命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Rails 使用同一命名空间中的模型作为 belongs_to 引用,如何从外部引用模型

Rails 和 RSpec:在不同的命名空间(模块)中测试具有相同名称的控制器

Ruby 嵌套模块作为命名空间

Rails url_for 和命名空间模型

如何使用 swig C++ 命名空间作为 python 模块公开

删除存在于另一个命名空间 rails 中的模型