我想在我的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
但仍然得到同样的错误。
谢谢
答案 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"