Rails 4常数 - '单位常数'错误

时间:2015-07-27 15:48:55

标签: ruby-on-rails ruby-on-rails-4 constants

我试图在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_GROUPSFoo::ETHNIC_GROUPS,但没有成功。

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

3 个答案:

答案 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中定义的应用程序模块。我希望这可以工作,但工作的是:

  1. 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
    
  2. 在代码中使用AppConstants::ETHNIC_GROUPS调用常量。

  3. 使用application.rb中的(先前定义的)代码自动加载lib目录,这被正确地拉入了应用程序。

    使用&#39; rails_config&#39;可以实现相同的结果。 gem,或使用@Ojash建议的config/initializers/common_constants.rb文件。

    最后,我决定将常量放在lib目录中的不同文件中。这对我来说似乎有点清洁。我决定不再使用我不太了解的代码来吸引另一个宝石。

    我不知道为什么在我原始帖子中的选项2中提到的Foo::ETHNIC_GROUPS来电时,该常量未被引用。关于在Rails 4中自动加载lib文件的文章中的讨论似乎建议使用与应用程序模块同名的lib模块。在我尝试重命名模块后,它工作了。