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:在不同的命名空间(模块)中测试具有相同名称的控制器