Я полагаю, у вас есть немного неверное представление о том, что вы ожидаете от config / application.rb. Собственные классы ActiveRecord :: Base и ActiveController :: Base используют класс Rails :: Application :: Configuration, который настраивается в config / application.rb. Атрибуты недоступны в классах, которые происходят от базовых классов или их собственных классов. Вот почему вы сталкиваетесь с ошибками в ApplicationController.
Как правило, есть два способа инициализации конфигурации в приложении Rails. Первый способ - создать модуль конфигурации, а затем загрузить в него значения через инициализатор:
Сначала создайте модуль Twiter Config:
#lib/twitter_config.rb
module TwitterConfig
def self.config
@@config ||= {}
end
def self.config=(hash)
@@config = hash
end
end
Создайте файл конфигурации YAML:
# config/twitter.yaml
development: &base
key: "foo"
secret: "bar"
test:
<<: *base
key: "foo2"
production:
<<: *base
secret: "barbar"
В качестве альтернативы, если вы не собираетесь добавлять config / twitter.yaml в свой SCM, вы можете просто пропустить это и установить ключ и секрет с помощью переменных среды. Это было бы предлагаемое решение для приложения с общедоступным хранилищем SCM, развертываемым на Heroku.
Затем загрузите и установите значение через инициализатор:
#config/initializers/01_twitter.rb
require 'twitter_config'
TwitterConfig.config = YAML.load_file("config/config.yml")[Rails.env].symbolize_keys
Как правило, рекомендуется нумеровать файлы инициализатора, поскольку Rails будет загружать их в порядке, соответствующем их имени файла. Если вы инициализируете хранилище данных, и это критично для других шагов, тогда ему нужно наименьшее число. В качестве альтернативы, если вы используете переменные окружения, это будет файл инициализации:
#config/initializers/01_twitter.rb
require 'twitter_config'
TwitterConfig.config[:key] = ENV['twitter_config_key']
TwitterConfig.config[:secret] = ENV['twitter_config_secret']
Во всем приложении Rails у вас теперь есть доступ к значениям конфигурации с помощью TwitterConfig.config [: key] и TwitterConfig.config [: secret]. Вы также можете включить модуль, просто следите за конфликтами.
Вы также можете просто загрузить значения в качестве глобальной константы. Хотя мне немного некрасиво:
#config/application.rb
TWITTER_CONFIG = YAML.load_file("config/twitter.yaml")[Rails.env]