2015-07-27 2 views
1

Я пытаюсь использовать глобальные константы в приложении Rails 4 для проверки определенных элементов, таких как электронные письма, этнические группы и т. Д. Я следил за подходом, описанным в переполнении стека статья "How do you store custom constants in Rails 4", без успеха.Rails 4 константы - ошибка «Unitialized constant»

Я определил файл 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 

Это выглядит, как это было по существу обезьяны патч, или добавить к существующему модулю Foo, определенный в config/application.rb - мое предположение, во всяком случае ,

Я перезапустил сервер, перезагрузил консоль и т. Д. После каждого изменения. Независимо от того, сколько раз я делаю это, я продолжаю получать неинициализированную постоянную ошибку. В консоли, я попытался назвать оба ETHNIC_GROUPS и Foo::ETHNIC_GROUPS без успеха.

Оцените понимание лучших практик работы с глобальными константами приложения в Rails 4, а также понимание того, почему это не работает для меня.

+3

Вы можете вставить его в config/initializers ... –

ответ

1

Я рекомендую вам «rails_config» перл: Github

Это позволяет поместить любое количество настроек в .yml файле. Он также позволяет создавать разные файлы настроек для каждой среды.

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 
+0

Спасибо @Ojash! Очень полезно. См. Мой пост ниже в качестве ответа. В моем сообщении мне предложили переименовать модуль в моем каталоге 'lib', и он сработал. Я предпочитаю использовать 'lib' вместо' config/initializers' для хранения файла, поэтому я решил опубликовать другой ответ. Однако ваш метод работает. Я не уверен, что такое соглашение Rails, похоже, видели обсуждения, поддерживающие оба метода. – Scro

1

Цените ответы! Я понял, что проблема заключалась в определении моего модуля в lib/Foo.rb, чтобы попытаться совместить модуль приложения, определенный в config/application.rb. Я бы ожидать, что работать, но то, что сделал работу является:

  1. Defined модуль AppConstants в lib/app_constants.rb:

    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», либо с использованием файла config/initializers/common_constants.rb, как предлагается @Ojash.

В конце концов я решил, что предпочитаю иметь константы в отдельном файле в каталоге lib. Мне это кажется немного чище. Я решил, что лучше не использовать другой драгоценный камень с кодом, который я не всегда понимаю.

Я не знаю, почему константа не получала ссылку при вызове Foo::ETHNIC_GROUPS, как указано в Варианте 2 в моем первоначальном сообщении. Обсуждение в статье об автозагрузке файлов lib в Rails 4, похоже, рекомендовало использовать модуль lib с таким же именем, как и модуль приложения. После того, как я попытался переименовать модуль, он сработал.

Смежные вопросы