【问题标题】:Rails 4 constants - 'Unitialized constant' errorRails 4 常量 - “未初始化的常量”错误
【发布时间】:2015-07-27 15:48:55
【问题描述】:

我正在尝试在 Rails 4 应用程序中使用全局常量来验证某些元素,例如电子邮件、种族等。我遵循了堆栈溢出文章 "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 中使用全局应用程序常量的最佳实践的任何见解,以及对为什么这对我不起作用的见解。

【问题讨论】:

  • 你可以把它放在 config/initializers...

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


【解决方案1】:

我推荐你“rails_config” gem:Github

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

【讨论】:

    【解决方案2】:

    一种常见的方法是在config/initializers 中创建一个common_constant.rb 文件并在那里添加你的常量

    module CommonConstants
      MY_VARIABLE = 'foo'
      MY_HASH = {
        foo: 'more foo',
        bar: 'big bar'
      }
      MY_ARRAY = ['foo','bar']
    end
    

    并访问它

    CommonConstants::MY_VARIABLE
    

    【讨论】:

    • 感谢@Ojash!很有帮助。请参阅下面的我的帖子作为答案。您的帖子让我尝试重命名我的 lib 目录中的模块并且它有效。我更喜欢使用lib 而不是config/initializers 来存储文件,这就是我决定发布另一个答案的原因。不过,您的方法有效。我不确定 Rails 约定是什么 - 似乎已经看到支持这两种方法的讨论。
    【解决方案3】:

    欣赏答案!我意识到问题是在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 调用常量。

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

    使用“rails_config”gem 或使用@Ojash 建议的config/initializers/common_constants.rb 文件可以实现相同的结果。

    最后我决定我更喜欢将常量放在lib 目录中的不同文件中。这对我来说似乎更干净。我决定不使用我不一定理解的代码引入另一个 gem。

    我不知道为什么在调用 Foo::ETHNIC_GROUPS 时没有引用常量,正如我原来帖子中选项 2 中所述。文章中关于在 Rails 4 中自动加载 lib 文件的讨论似乎建议使用与应用程序模块同名的 lib 模块。在我尝试重命名模块后它起作用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多