我正在尝试使用Rails4应用程序中的全局常量来验证某些元素,例如电子邮件、种族等。我遵循了堆栈溢出文章"How do you store custom constants in Rails 4"中概述的方法,但没有成功。
我定义了一个文件lib/constants.rb作为所有应用程序范围的常量的位置。在我的config/application.rb文件中,我包含了以下代码:
module Foo
class Application < Rails::Application
# extraneous code omitted
config.autoload_paths << Rails.root.join('lib') # added this line to include lib directory
end
end我已经尝试了几种定义和加载常量的方法,但仍然遇到错误。
尝试1:使用定义常量的代码创建了一个文件lib/constants.rb:
ETHNIC_GROUPS = ["N/A", "African American/Black", "American Indian", "Hispanic", "Puerto Rican",
"Alaskan Native", "Asian American/Pacific Islander", "Mexican American/Chicano"]尝试2:根据"Auto-loading lib files in Rails 4"文章中的讨论,我修改了文件名和代码,尝试以另一种方式加载常量。根据那篇文章,我定义了一个文件lib/Foo.rb(与config/application.rb中的应用程序名称相匹配):
module Foo
# Define custom constants for the application
ETHNIC_GROUPS = ["N/A", "African American/Black", "American Indian", "Hispanic", "Puerto Rican",
"Alaskan Native", "Asian American/Pacific Islander", "Mexican American/Chicano"]
end这看起来像是在打猴子补丁,或者添加到config/application.rb中定义的现有Foo模块中--不管怎样,这是我的假设。
每次更改后,我都会重新启动服务器,重新加载控制台,等等。无论我这样做了多少次,我仍然得到未初始化的常量错误。在控制台中,我尝试调用ETHNIC_GROUPS和Foo::ETHNIC_GROUPS,但都没有成功。
感谢您对在Rails 4中使用全局应用程序常量的最佳实践的任何见解,以及对为什么这对我不起作用的见解。
发布于 2015-07-27 23:54:54
我推荐你"rails_config“gem:Github
它允许您将任意数量的设置放入.yml文件中。它还允许为每个环境创建不同的设置文件。
发布于 2015-07-28 00:04:00
module CommonConstants
MY_VARIABLE = 'foo'
MY_HASH = {
foo: 'more foo',
bar: 'big bar'
}
MY_ARRAY = ['foo','bar']
end并访问它
CommonConstants::MY_VARIABLE发布于 2015-07-28 01:38:34
感谢你的回答!我意识到问题是在lib/Foo.rb中定义我的模块,以尝试匹配config/application.rb中定义的应用程序模块。我希望它能起作用,但它起作用的是:
lib/app_constants.rb中定义了一个AppConstants模块:module AppConstants ETHNIC_GROUPS = "N/A",“非洲裔美国人/黑人”,“美国印第安人”,“西班牙裔”,“波多黎各人”,“阿拉斯加原住民”,“亚裔美国人/太平洋岛民”,“墨西哥裔美国人/奇卡诺人”结束
AppConstants::ETHNIC_GROUPS调用常量。使用application.rb中的(先前定义的)代码自动加载lib目录,这将正确地拉入到应用程序中。
无论是使用'rails_config‘gem,还是使用@Ojash建议的config/initializers/common_constants.rb文件,都可以获得相同的结果。
最后,我决定将常量放在lib目录下的一个不同的文件中。这对我来说似乎更干净一些。我决定不再用我不一定理解的代码来吸引另一块宝石。
我不知道为什么在调用Foo::ETHNIC_GROUPS时没有引用常量,就像我最初的帖子中的选项2所指出的那样。文章中关于在Rails4中自动加载lib文件的讨论似乎建议使用与应用程序模块同名的lib模块。在我尝试重命名模块后,它起作用了。
https://stackoverflow.com/questions/31657602
复制相似问题