首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4常量- 'Unitialized constant‘错误

Rails 4常量- 'Unitialized constant‘错误
EN

Stack Overflow用户
提问于 2015-07-27 23:48:55
回答 3查看 159关注 0票数 1

我正在尝试使用Rails4应用程序中的全局常量来验证某些元素,例如电子邮件、种族等。我遵循了堆栈溢出文章"How do you store custom constants in Rails 4"中概述的方法,但没有成功。

我定义了一个文件lib/constants.rb作为所有应用程序范围的常量的位置。在我的config/application.rb文件中,我包含了以下代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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中的应用程序名称相匹配):

代码语言:javascript
复制
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_GROUPSFoo::ETHNIC_GROUPS,但都没有成功。

感谢您对在Rails 4中使用全局应用程序常量的最佳实践的任何见解,以及对为什么这对我不起作用的见解。

EN

回答 3

Stack Overflow用户

发布于 2015-07-27 23:54:54

我推荐你"rails_config“gem:Github

它允许您将任意数量的设置放入.yml文件中。它还允许为每个环境创建不同的设置文件。

票数 1
EN

Stack Overflow用户

发布于 2015-07-28 00:04:00

代码语言:javascript
复制
module CommonConstants
  MY_VARIABLE = 'foo'
  MY_HASH = {
    foo: 'more foo',
    bar: 'big bar'
  }
  MY_ARRAY = ['foo','bar']
end

并访问它

代码语言:javascript
复制
CommonConstants::MY_VARIABLE
票数 1
EN

Stack Overflow用户

发布于 2015-07-28 01:38:34

感谢你的回答!我意识到问题是在lib/Foo.rb中定义我的模块,以尝试匹配config/application.rb中定义的应用程序模块。我希望它能起作用,但它起作用的是:

  1. 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模块。在我尝试重命名模块后,它起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31657602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档