我试图在Rails 4应用程序中使用全局常量来验证某些元素,例如电子邮件,种族群等。我已经按照堆栈溢出文章{{3}中概述的方法进行了操作}, 没有成功。
我已将文件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:基于文章"How do you store custom constants 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中使用全局应用程序常量的最佳实践的任何见解,以及了解为什么这对我不起作用。
答案 0 :(得分:1)
我建议你“ rails_config ”gem:Github
它允许您在.yml文件中放置任意数量的设置。它还允许为每个环境创建不同的设置文件。
答案 1 :(得分:1)
一种常见的方法是在common_constant.rb
中创建config/initializers
文件并在那里添加常量
module CommonConstants
MY_VARIABLE = 'foo'
MY_HASH = {
foo: 'more foo',
bar: 'big bar'
}
MY_ARRAY = ['foo','bar']
end
并访问它
CommonConstants::MY_VARIABLE
答案 2 :(得分:1)
欣赏答案!我意识到问题是在lib/Foo.rb
中定义我的模块以尝试匹配config/application.rb
中定义的应用程序模块。我希望这可以工作,但工作的是:
在lib/app_constants.rb
中定义了一个AppConstants模块:
module AppConstants
ETHNIC_GROUPS = ["N/A", "African American/Black", "American Indian", "Hispanic", "Puerto Rican",
"Alaskan Native", "Asian American/Pacific Islander", "Mexican American/Chicano"]
end
在代码中使用AppConstants::ETHNIC_GROUPS
调用常量。
使用application.rb中的(先前定义的)代码自动加载lib
目录,这被正确地拉入了应用程序。
使用&#39; rails_config&#39;可以实现相同的结果。 gem,或使用@Ojash建议的config/initializers/common_constants.rb
文件。
最后,我决定将常量放在lib
目录中的不同文件中。这对我来说似乎有点清洁。我决定不再使用我不太了解的代码来吸引另一个宝石。
我不知道为什么在我原始帖子中的选项2中提到的Foo::ETHNIC_GROUPS
来电时,该常量未被引用。关于在Rails 4中自动加载lib文件的文章中的讨论似乎建议使用与应用程序模块同名的lib模块。在我尝试重命名模块后,它工作了。