Как определить пользовательские переменные конфигурации в рельсах
Мне было интересно, как добавить пользовательские переменные конфигурации в приложение rails и как получить к ним доступ в контроллере, например, я хочу иметь возможность определить upload_directory в файлах конфигурации, например, development.rb, и получить доступ к ним в одном из моих контроллеры.
Во-вторых, я планировал иметь поддержку S3 для загрузки в мое приложение, если я хотел добавить файл yaml с доступом к s3, секретным ключом, как мне инициализировать его в моем приложении Rails и как получить доступ к значениям, которые я определил в этом конфигурационном файле.
15 ответов
Обновление 1
Очень рекомендую: сейчас я собираюсь использовать Rails Config gem для тонкого контроля, который он обеспечивает.
Update2
Если вы хотите быстрое решение, то проверьте ответ Джека Пратта ниже.
Хотя мой оригинальный ответ ниже все еще работает, этот ответ устарел. Я рекомендую посмотреть на обновления 1 и 2.
Оригинальный ответ:
Для быстрого решения очень полезно посмотреть на экран "Файл конфигурации YAML", созданный Райаном Бейтсом.
В итоге:
# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
# application.rb
if APP_CONFIG['perform_authentication']
# Do stuff
end
В Rails 3 специальные пользовательские данные конфигурации приложения могут быть помещены в объект конфигурации приложения. Конфигурация может быть назначена в файлах инициализации или файлах среды - скажем, для данного приложения MyApp
:
MyApp::Application.config.custom_config_variable = :my_config_setting
или же
Rails.configuration.custom_config_variable = :my_config_setting
Чтобы прочитать настройку, просто вызовите переменную конфигурации, не устанавливая ее:
Rails.configuration.custom_config_variable
=> :my_config_setting
ОБНОВЛЕНИЕ Rails 4
В Rails 4 появился новый способ для этого => http://guides.rubyonrails.org/configuring.html
В Rails 3.0.5 у меня работал следующий подход:
В config/environments/development.rb
, записывать
config.custom_config_key = :config_value
Значение custom_config_key
затем можно ссылаться из других файлов, используя
Rails.application.config.custom_config_key
В Rails 4
Предполагая, что вы поместили свои пользовательские переменные в файл yaml:
# config/acme.yml
development:
:api_user: 'joe'
:api_pass: 's4cret'
:timeout: 20
Создайте инициализатор для их загрузки:
# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme
Rails.application.configure do
config.acme = ActiveSupport::OrderedOptions.new
config.acme.api_user = acme_config[:api_user]
config.acme.api_pass = acme_config[:api_pass]
config.acme.timeout = acme_config[:timeout]
end
Теперь в любом месте вашего приложения вы можете получить доступ к этим значениям следующим образом:
Rails.configuration.acme.api_user
Это удобно, что Rails.application.config_for :acme
загрузит ваш acme.yml
и использовать правильную среду.
Это работает в рельсах 3.1:
в config/environment.rb (или в config / средах /.. для определения конкретной среды):
YourApp::Application.config.yourKey = 'foo'
Это будет доступно в контроллере или представлениях как это:
YourApp::Application.config.yourKey
(Ваше приложение должно быть заменено именем вашего приложения.)
Примечание: это код Ruby, поэтому, если у вас много ключей конфигурации, вы можете сделать это:
в config / environment.rb:
YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
Начиная с Rails 4.2, без дополнительных гемов, вы можете загрузить config/hi.yml просто используя Rails.application.config_for :hi
,
Например:
touch config/passwords.yml
#config/passwords.yml development: username: 'a' password: 'b' production: username: 'aa' password: 'bb'
touch config/initializers/constants.rb
#config/initializers/constants.rb AUTHENTICATION = Rails.application.config_for :passwords
и теперь вы можете использовать
AUTHENTICATION
постоянная везде в вашем приложении:#rails c production :001> AUTHENTICATION['username'] => 'aa'
затем добавьте passwords.yml в .gitignore:
echo /config/passwords.yml >> .gitignore
создайте файл примера для вашего удобстваcp /config/passwords.yml /config/passwords.example.yml
а затем просто отредактируйте файл примера в рабочей консоли, указав фактические производственные значения.
Рельсы 6
Многие устаревшие ответы, поэтому добавляем тот, который специфичен для Rails 6.
Конфигурация для конкретного приложения находится в файлах инициализатора. Подробности здесь: направляющие кромки
Пример:
конфигурация / инициализаторы / foo.rb
module MyApp
class Application < Rails::Application
config.test_val = 'foo'
end
end
Альтернативно:
Rails.application.config.test_val = 'foo'
Теперь к нему можно получить доступ как:
Rails.configuration.test_val
Еще много возможностей.направляющие края #custom-configuration
ex, вы также можете настроить конфигурации вложенного пространства имен:
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
или используйте config_for для загрузки целых пользовательских файлов конфигурации:
config / payment.yml
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
Затем загрузите его:
конфиг / инициализаторы / load_payment.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
Я просто хотел обновить это для последней крутой вещи в Rails 4.2, теперь вы можете сделать это в любом из ваших config/**/*.rb
файлы:
config.x.whatever.you.want = 42
... и это будет доступно в вашем приложении как:
Rails.configuration.x.whatever.you.want
Подробнее здесь: http://guides.rubyonrails.org/configuring.html
Проверьте этот аккуратный драгоценный камень, делающий именно это: https://github.com/mislav/choices
Таким образом, ваши конфиденциальные данные не будут представлены в проектах с открытым исходным кодом.
Мне очень нравится настройка логического драгоценного камня. Очень прост в настройке и использовании.
Я создал простой плагин для настроек YAML: Йеттингс
Он работает аналогично коду в ответе khelll, но вам нужно только добавить этот файл конфигурации YAML:
app/config/yetting.yml
Плагин динамически создает класс, который позволяет вам получить доступ к настройкам YML как методы класса в вашем приложении, например, так:
Yetting.your_setting
Кроме того, если вы хотите использовать несколько файлов настроек с уникальными именами, вы можете поместить их в подкаталог в app / config следующим образом:
app/config/yettings/first.yml
app/config/yettings/second.yml
Затем вы можете получить доступ к значениям, как это:
FirstYetting.your_setting
SecondYetting.your_setting
Он также предоставляет вам настройки по умолчанию, которые могут быть переопределены для каждой среды. Вы также можете использовать erb внутри файла yml.
Если вы используете Heroku или иным образом должны сохранять настройки приложения в качестве переменных среды, драгоценность figaro очень полезна.
Мне нравится использовать rails-settings для глобальных значений конфигурации, которые должны быть изменены через веб-интерфейс.
Что-то, что мы начинаем делать на работе, это ActiveSupport Ordered Hash
Что позволяет вам четко определить вашу конфигурацию в файлах среды, например
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
Я бы посоветовал хороший подход к настройке вашего приложения вообще. Есть три основных правила:
- измените свою конфигурацию, а не код;
- использовать конфигурации сверх условий;
- написать код, который что-то значит.
Чтобы получить более подробный обзор, перейдите по этой ссылке: Правильно настроить Rails