如何在Rails中正确执行命名空间

时间:2017-01-11 10:20:28

标签: ruby-on-rails

我想在我的Rails5应用程序中添加一些与环境相关的政策,我希望将其构建如下。

app
|_ policies
      |_ development
            |_  policy_x.rb
      |_ production
            |_  policy_x.rb
      |_ test
            |_  policy_x.rb



Class Policies::Development::PolicyX
end

依旧......

然后我在初始化程序中调用我需要的策略

MYPOLICY = Policies::Development::PolicyX 

然而,当我尝试这样做时,我得到NameError: uninitialized constant Policies

我在这里遗漏了什么吗?

UPDATE1

使用相同的结构我也定义了我的类如下

module Policies
  module Development
    class PolicyX
    end
  end
end

module Policies
  module Test
    class PolicyX
    end
  end
end

module Policies
  module Production
    class PolicyX
    end
  end
end

但仍然得到同样的错误。

谢谢

1 个答案:

答案 0 :(得分:1)

类/文件/文件夹名称约定

Rails在如何定义类和文件名方面有许多约定。例如,名为PolicyX的类应驻留在名为policy_x.rb的文件中。

模块和文件夹结构也是如此。

如果您不遵守此标准惯例,Rails将无法加载您的课程。

自动加载路径

默认情况下,Rails会查看app/

下的所有文件夹
app/assets
app/channels
app/controllers
app/controllers/concerns
app/helpers
app/jobs
app/mailers
app/models
app/models/concerns
app/policies

当Rails搜索app/policies时,它在那里找不到满足命名和层次结构约定的Policies模块。为此,您的文件夹结构必须是

app  
  policies  
    policies  
      development
        policy_x.rb

......显然看起来很奇怪。

您可以通过三种不同方式解决此问题:
a)改变你的文件夹结构和/或模块层次结构,以符合Rails的惯例
b)将Policies::Development::XPolicy更改为Development::XPolicy
c)将app添加到autoload_paths。通过直接查看app/,Rails将能够找到policies文件夹。

# application.rb
config.autoload_paths += %W(#{config.root}/app)

PS:Rails在模块或类名上使用underscore方法来确定要加载的文件。

2.3.0 :001 > 'PolicyX'.underscore
 => "policy_x"